我有一个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)})
我接近脚本......
-- 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);
小组行动看起来很有希望......
(a,{(a,{(b,c),(d,e)}),(a,{(f,g),(h,i)})})
但是我无法找到如何在上面的包中弄平内部..脚本已经让我回到我开始的地方......我已经尝试了很多变化而没有成功(主要是产生PIG错误)。
这是我得到的以及上面的脚本(而不是我想要的)。
(a,{(b,c),(d,e)})
(a,{(f,g),(h,i)})
作为PIG的Newbe,我可以让猪把内袋弄平并接近我想要的东西:
(a,{(b,c),(d,e),(f,g),(h,i)})
菲尔
答案 0 :(得分:0)
您是否尝试过“暴力”方法并将资源消耗与您所获得的资源消耗进行比较,例如仅GROUP
而忘记尝试将交易放入单个行李中?你可能不会发现蛮力方法优雅,但想想它正在做什么,以及它是否真的很低效。
您理想的方式是按用户分组并合并所有组合在一起的行李。这意味着将每个输入记录的密钥和交易包发送给某个减速器。从那里你必须遍历行李,拉出每个交易并将其放入该用户的最终行李中。
强力方法使用FLATTEN
,以便对于每个输入记录中的每个事务,将密钥和事务发送到某个reducer。通过重复发送用户ID,这里有一些重复,但这不是什么大问题,特别是如果您的交易数据的大小远大于您的用户ID的大小。从那里,您只需将每个交易添加到该用户的最终包中。
这对我来说听起来不是特别低效,并且它不涉及任何额外的map-reduce步骤。从映射器发送到Reducer的数据大小非常接近。我怀疑你不会通过在整个计算过程中将一天的交易保持在一起来大幅提高性能。