hadoop - 如何在级联中重命名管道字段?

标签 hadoop mapreduce cascading

在两个不同的场合,我不得不重命名 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 中来解决这个问题接受映射而不是从/到字段对齐。

Merge 也需要传入管道声明相同的字段,但 CoGroup 只需要您提供 declaredFields 以确保输出上没有名称冲突(所有字段传播通过,甚至对来自所有输入的键进行分组) .

关于hadoop - 如何在级联中重命名管道字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15953035/

相关文章:

hadoop - Apache Hadoop - 节点机器差异?

hibernate @ManyToOne仅适用于CascadeType.ALL

hadoop - 级联Hadoop文件加载-处理跨越换行符的记录的方法?

java - "Shortcut"在reduce()方法中确定Iterator<IntWritable>中的最大元素

hadoop - 我怎样才能做到这一点而不必一张一张地导入表格?

hadoop - 确定要为Hadoop map reduce程序中的最快处理指定的reducer的最佳数量

hadoop - 我如何在hadoop工作中通过Third Argument

hadoop - 远程执行 hadoop 作业时出现异常

hadoop - 在CDH3上运行级联代码时出错-在缓存中找不到 token

hadoop - 使用 WebHDFS REST API 创建文件时出现 RemoteException