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
?
PIG 0.12 からは、Over 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を使用するだけです。
Hive は、これを 1 行で実行するための非常に優れた方法を提供し
ます。以下のプロセスに従って、目標の出力を達成してください。
データセット (日とセール) を含むことができるSALESハイブテーブルを作成します -
day sale
day1, 10
day2, 20
day3, 30
ハイブターミナルで以下のコマンドを実行するだけです-
SELECT day, SUM(sale) OVER (ORDER BY DAY) FROM SALES;
出力は次のようになります-
day1, 10
day2, 30
day3, 60
これが目標の出力を得るのに役立つことを願っています。
データセットとそれ自体の外積を使用して解決策を思い付くことができました。
サンプル入力:
{"daynum": "1", "daycount": 5}
{"daynum": "2", "daycount": 10}
{"daynum": "3", "daycount": 7}
{"daynum": "4", "daycount": 8}
豚のスクリプト:
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)
map reduce パラダイムを利用する pig で実行中の合計を計算する効率的な方法はありますか? いいえ、そうは思いません。各エントリはその前のエントリに依存しているため、これを並行して行う良い方法はありません。
Pigでこれを行うことはまったく可能ですか? はい、group all を実行してすべてのデータを 1 つのバッグに入れ、必要な処理を行う UDF を作成できます。この関数は、代数的でない場合でも、少なくともアキュムレータ インターフェイスを実装できます。 https://issues.apache.org/jira/browse/PIG-296は、まさにこれを行うために UDF を書いた人への古くて実装されていないリンクのように見えます。