0

在两个不同的情况下,我不得不重命名管道中的所有字段以加入(使用Mergeor 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 中的字段位置保持不变并且它们的大小相同等。

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

4

1 回答 1

2

您可以通过利用 Rename 处理对齐的 from/to 字段的能力来消除一些仪式,如下所示:

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

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

cascading.jruby 通过将重命名包装在一个接受映射而不是从/到字段对齐的函数中来解决这个问题。

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

于 2013-05-25T12:27:30.777 回答