我有一个 Pig 作业,每天运行跟踪一些用户帐户,每个用户每天都有一些交易。作为流程的一部分,这个 PIG 每天写出按用户分组的交易(作为使用 Avro 的旁白)。
我现在想将每个用户帐户和流程的一周(或更长时期)的所有交易组合在一起。
我可以在 PIG 中通过如下蛮力来做到这一点,但似乎必须有比展平和重新组合所有事务更好的方法。更详细...
有效的起点......(a是用户,(b,c)和(d,e)表示两个转换,如(f,g)和(h,i)
我在读...
(a,{(b,c),(d,e)}) -- From first file - Monday
(a,{(f,g),(h,i)}) -- from second file - Tuesday
我想要 ...
(a,{(b,c),(d,e),(f,g),(h,i)})
我接近脚本......</p>
-- Read in multiple days (one day per file, $input is directory with all files)
DayGroupedRecord = LOAD '$input' USING AvroStorage();
FlattenRecord = FOREACH DayGroupedRecord GENERATE $0 AS Key, FLATTEN ($1);
WeeklyGroup = GROUP FlattenRecord BY $0;
这给
(a,{(a,b,c),(a,d,e),(a,f,g),(a,h,i)})
这已经足够好了。然而,该组必须在每个事务级别操作似乎效率低下,因为输入记录已经部分分组。
PIG 中是否有不同的方法(可能更有效),我将每日组分组然后变平?
我尝试过(但失败了)...
DayGroupedRecord = LOAD '$input' USING AvroStorage();
WeeklyGroupNested = GROUP DayGroupedRecord BY $0;
WeeklyGroup = FOREACH WeeklyGroupNested GENERATE FLATTEN($1);
集团化运营看起来很有希望……</p>
(a,{(a,{(b,c),(d,e)}),(a,{(f,g),(h,i)})})
但是我不知道如何在上面的包中弄平内部..脚本让我回到了我开始的地方......我尝试了一些关于 flatten 的变体但没有成功(主要是生成猪错误)。
这就是我得到的和上面的脚本(而不是我想要的)。
(a,{(b,c),(d,e)})
(a,{(f,g),(h,i)})
作为 PIG 的新手,我可以让猪把内袋弄平并接近我想要的东西:
(a,{(b,c),(d,e),(f,g),(h,i)})
菲尔