2

我有一个 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)})  

菲尔

4

1 回答 1

0

您是否尝试过“蛮力”方法并将资源消耗与您获得的资源消耗进行比较,例如,只是GROUP忘记尝试将事务放入一个包中?你可能觉得蛮力方法并不优雅,但想想它在做什么,以及它是否真的效率低下。

您理想的方法是按用户分组并将所有分组的包合并在一起。这意味着将每个输入记录的密钥和交易包发送到某个 reducer。从那里你必须遍历包,取出每笔交易并将其放入该用户的最终包中。

蛮力方法使用FLATTEN,以便对于每个输入记录中的每个事务,您将密钥和事务发送到某个减速器。重复发送用户 ID 会有一些重复,但这没什么大不了的,特别是当您的交易数据的大小远大于您的用户 ID 的大小时。从那里,您只需将每笔交易添加到该用户的最终包中。

这对我来说并不是特别低效,而且它不涉及任何额外的 map-reduce 步骤。从映射器发送到减速器的数据大小非常接近。我怀疑您不会通过尝试在整个计算过程中将一天的事务分组在一起来显着提高性能。

于 2013-11-11T14:03:03.183 回答