在两个不同的场合,我不得不重命名Pipe中的所有字段以进行联接(使用MergeCoGroup)。我最近做的是:

//These two pipes contain similar values but different Field Names
Pipe papa = new Retain(papa, fieldsFrom);
Pipe pepe = new Retain(pepe, fieldsTo);

//Where fieldsFrom.size() == fieldsTo.size() and the fields positions match
for (int i =0; i < fieldsFrom.size(); i++){

    pepe = new Rename(pepe, fieldsFrom.select(new Fields(i)),
                            fieldsTo.select(new Fields(i)));

}

//this allows me to do this
Pipe retVal = new Merge(papa, pepe);

显然,这非常脆弱,因为我需要确保FieldsFrom和FieldsTo中的字段位置保持不变,并且它们的大小相同。

有没有一种更好的,更不那么脆弱的合并方式,而无需完成上述所有仪式?

最佳答案

您可以利用Rename的能力来处理对齐方式,从而消除某些仪式:

pepe = new Rename(pepe, fieldsFrom, fieldsTo);

但这只会消除for循环;是的,您必须确保fieldsFrom和fieldsTo具有相同的大小并对齐以正确表示重命名。

cascading.jruby通过将重命名包装在function中来解决此问题,该ojit_a接受映射而不是字段之间的对齐。

在这种情况下,Merge要求传入管道声明相同的字段,但CoGroup仅要求您提供clarifiedFields以确保输出上没有名称冲突(所有字段都会传播,甚至对所有输入的键进行分组)。

09-10 19:28