在两个不同的场合,我不得不重命名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的能力来处理像这样对齐的from/to字段来消除一些仪式:
pepe = new Rename(pepe, fieldsFrom, fieldsTo);
但是这只是消除了for循环;是的,您必须确保fieldsFrom和fieldsTo是相同的大小和对齐,以正确地表达重命名。
层叠。Jruby通过在一个接受映射而不是从/到字段对齐的函数中包装重命名来解决这个问题。
这也是Merge要求输入管道声明相同字段的情况,但是CoGroup只要求您提供declaredFields以确保输出上没有名称冲突(所有字段都通过传播,甚至从所有输入分组键)。