在两个不同的场合,我不得不重命名Pipe中的所有字段以进行联接(使用Merge
或CoGroup
)。我最近做的是:
//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以确保输出上没有名称冲突(所有字段都会传播,甚至对所有输入的键进行分组)。