如何在层叠中重命名管道字段?

时间:2013-04-11 15:36:51

标签: hadoop mapreduce cascading

在两个不同的场合,我必须重命名管道中的所有字段才能加入(使用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中的字段位置保持不变并且它们的大小相同等。

有没有一个更好的 - 不那么脆弱的合并方式而不经历上述所有仪式?

1 个答案:

答案 0 :(得分:2)

你可以利用Rename处理对齐/来自这样的字段的能力来消除一些仪式:

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

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

cascading.jruby通过在function中包含重命名来解决此问题,该{{3}}接受映射而不是从/到字段对齐。

Merge还要求传入管道声明相同的字段,但CoGroup只要求您提供declaredFields以确保输出上没有名称冲突(所有字段都传播,甚至从所有输入分组键)