Как переименовать поля 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 оставались постоянными и имели одинаковый размер и т. д.

Есть ли лучший - менее хрупкий способ слияния без прохождения всей описанной выше церемонии?


person Engineiro    schedule 11.04.2013    source источник


Ответы (1)


Вы можете избавиться от некоторых церемоний, используя способность Rename обрабатывать выровненные поля from/to следующим образом:

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

Но это только устраняет цикл for; да, вы должны убедиться, что поля fieldsFrom и fieldsTo имеют одинаковый размер и выровнены для правильного выражения переименования.

cascading.jruby решает эту проблему, заключая переименование в функция, которая принимает сопоставление, а не выравнивание по полям.

Также дело обстоит так, что Merge требует, чтобы входящие каналы объявляли одни и те же поля, но CoGroup требует, чтобы вы предоставили manifestFields, чтобы гарантировать отсутствие конфликтов имен на выходе (все поля распространяются, даже группируя ключи из всех входов).

person Matt Walker    schedule 25.05.2013