在两个不同的场合,我必须重命名管道中的所有字段才能加入(使用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中的字段位置保持不变并且它们的大小相同等。
有没有一个更好的 - 不那么脆弱的合并方式而不经历上述所有仪式?
答案 0 :(得分:2)
你可以利用Rename处理对齐/来自这样的字段的能力来消除一些仪式:
pepe = new Rename(pepe, fieldsFrom, fieldsTo);
但这只能消除for循环;是的,您必须确保fieldsFrom和fieldsTo具有相同的大小并对齐以正确表达重命名。
cascading.jruby通过在function中包含重命名来解决此问题,该{{3}}接受映射而不是从/到字段对齐。
Merge还要求传入管道声明相同的字段,但CoGroup只要求您提供declaredFields以确保输出上没有名称冲突(所有字段都传播,甚至从所有输入分组键)