在两个不同的场合,我不得不重命名 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 中来解决这个问题接受映射而不是从/到字段对齐。
Merge 也需要传入管道声明相同的字段,但 CoGroup 只需要您提供 declaredFields 以确保输出上没有名称冲突(所有字段传播通过,甚至对来自所有输入的键进行分组) .
关于hadoop - 如何在级联中重命名管道字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15953035/