Есть ли способ вычислить общее количество с Pig?Как вычислить общее количество свинья?
Например, если мои данные:
day1, 10
day2, 20
day3, 30
есть способ создания
day1, 10
day2, 30
day3, 60
?
Есть ли способ вычислить общее количество с Pig?Как вычислить общее количество свинья?
Например, если мои данные:
day1, 10
day2, 20
day3, 30
есть способ создания
day1, 10
day2, 30
day3, 60
?
Есть ли эффективный способ расчета общей суммы с помощью свиньи, которая использует парадигму уменьшения карты? Нет, я так не думаю. Каждая запись основывается на записи перед ней, что означает, что нет хорошего способа сделать это параллельно.
Возможно ли это сделать с помощью свиньи? Да, вы могли бы сделать группу всех, чтобы поместить все данные в один мешок, а затем написать UDF, который делает то, что вы хотите. Функция может реализовать, по крайней мере, интерфейс аккумулятора, если не алгебраична. https://issues.apache.org/jira/browse/PIG-296 выглядит как старая, никогда не реализованная связь с тем, кто написал UDF, чтобы сделать именно это.
Я смог придумать решение, используя перекрестное произведение набора данных и самого себя.
входПример:
{"daynum": "1", "daycount": 5}
{"daynum": "2", "daycount": 10}
{"daynum": "3", "daycount": 7}
{"daynum": "4", "daycount": 8}
Pig сценарий:
raw = LOAD 'sample.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as (json:map[]);
dat = FOREACH raw GENERATE (int)json#'daynum' as daynum:int, (int)json#'daycount' as daycount:int;
dat2 = foreach dat generate daynum, daycount;
xp = cross dat, dat2;
xpf = filter xp by (dat::daynum >= dat2::daynum);
grp = group xpf by (dat::daynum);
out = foreach grp generate FLATTEN(group), SUM(xpf.dat2::daycount) as running_total_daycount;
dump out;
(1,5)
(2,15)
(3,22)
(4,30)
Это крайне неэффективно. Вы превратили проблему O (n) в O (n^2), чтобы ее можно было сделать у свиньи.Если у вас нет бесконечных хостов и нет бюджета, вам было бы лучше просто потопить исходный файл на главном узле и написать новый файл с суммарной суммой, а затем использовать это как вход для свиньи. – DMulligan
улей обеспечивает очень хороший способ сделать это в одной строке -
Пожалуйста, следуйте ниже процесса для достижения вашей целевой выход
создать ПРОДАЖИ таблица улей, которая может содержать ваш набор данных (день и продажа) -
day sale
day1, 10
day2, 20
day3, 30
Теперь просто запустите следующую команду в вашем улье терминале -
SELECT day, SUM(sale) OVER (ORDER BY DAY) FROM SALES;
Выход будет как -
day1, 10
day2, 30
day3, 60
Я надеюсь, что это может помочь вам получить вашу цель вывод.
Начиная с PIG 0.12, у вас есть За UDF
https://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/evaluation/Over.html
Так что
A = load 'T';
B = group A by si
C = foreach B {
C1 = order A by d;
generate flatten(Stitch(C1, Over(C1.f, 'sum(float)')));
}
D = foreach C generate s, $9;
будет эквивалентна этой
select s, sum(f) over (partition by si order by d) from T;
Я считаю, что это то, что вы мы ищем. В вашем случае вам просто нужно удалять группу или использовать группу ALL.
Если вы считаете нехорошо писать в улье, то почему вы не можете просто написать UDF, который будет содержать последнее значение SUM для добавления с новым? – Bector