2015-01-14 2 views
0

Мне нужно выполнить некоторые числовые операции (используя UDF) в каждом столбце моей таблицы. И для каждого столбца я получаю 2 значения (средний и стандартный-dev). Но конечный результат близок как (mean_1, sd_1, mean_2, sd_2, mean_3, sd_3...), где 1,2... - это индексы столбцов. Но мне нужен вывод для каждого столбца в отдельной строке. Как:Хранение результатов каждой операции столбца в отдельной строке в свинке

mean_1, sd_1 \\for col1 
mean_2, sd_2 \\for col2 
... 

Вот сценарий свинья Я использую:

data = LOAD 'input_file.csv' USING PigStorage(',') AS (C0,C1,C2); 
grouped_data = GROUP data ALL; 
res = FOREACH grouped_data GENERATE FLATTEN(data), AVG(data.$1) as mean, COUNT(data.$1) as count; 
tmp = FOREACH res { 
       diff = (C1-mean)*(C1-mean); 
       GENERATE *,diff as diff; 
       }; 
grouped_diff = GROUP tmp all; 
sq_tmp = FOREACH grouped_diff GENERATE flatten(tmp), SUM(tmp.diff) as sq_sum; 
stat_tmp = FOREACH sq_tmp GENERATE mean as mean, sq_sum/count as variance, SQRT(sq_sum/count) as sd; 
stats = LIMIT stat_tmp 1; 

Может кто-нибудь пожалуйста, руководство меня о том, как достичь этого?

+0

Таким образом, вы хотите использовать только одну строку данных результата? – LiMuBei

+0

Можете ли вы вставить свой свиной скрипт? –

+0

@LiMuBei: да только одна строка, содержащая результаты ... также я включил pigscript –

ответ

0

Спасибо. Я получил требуемый результат, создав кортежи средних и sd-значений для соответствующих столбцов, а затем сохранил все такие кортежи в сумке. Затем на следующем шаге я сплющил сумку.

tupled_stats = FOREACH raw_stats generate TOTUPLE(mean_0, var_0, sd_0) as T0, TOTUPLE(mean_1, var_1, sd_1) as T1, TOTUPLE(mean_2, var_2, sd_2) as T2; 
bagged_stats = FOREACH tupled_stats generate TOBAG(T0, T1, T2) as B; 
stats = foreach bagged_stats generate flatten(B); 
Смежные вопросы