В Hadoop, использующем Pig, у меня есть большое количество полей в нескольких отдельных источниках, которые я загружаю, фильтрую, проецирую, группирую, запускаю через пару пользовательских функций Java, объединяю, проецирую и сохраняю. (Это повседневная жизнь в Hadoop.) Некоторые поля исходной загрузки данных не используются UDF и не нужны до окончательного сохранения.
Когда лучше передать неиспользуемые поля через пользовательские функции, чем хранить и объединять их позже?
Тривиальный игрушечный пример — источник данных со столбцами name,weight,height
, и в конечном итоге я хочу сохранить name,weight,heightSquared
. Мой UDF будет возводить высоту за меня. Как лучше:
inputdata = LOAD 'data' AS name,weight,height;
outputdata = FOREACH inputdata
GENERATE myudf.squareHeight(name,weight,height)
AS (name,weight,heightSquared);
STORE outputdata INTO 'output';
or
inputdata = LOAD 'data' AS name,weight,height;
name_weight = FOREACH inputdata
GENERATE name,weight;
intdata1 = FOREACH inputdata
GENERATE myudf.squareHeight(name,height)
AS (iname,heightSquared);
intdata2 = JOIN intdata1 BY iname, name_weight BY name;
outputdata = FOREACH intdata2
GENERATE name,weight,heightSquared;
STORE outputdata INTO 'output';
В данном случае это выглядит довольно очевидно: первый случай лучше. Но UDF должна читать, сохранять и выводить поле weight
. Когда у вас есть 15 полей, на которые UDF не обращает внимания, и только одно, то первый случай все же лучше?