Hadoop 合并连接的清管器输入文件中的类似组

Hadoop 合并连接的清管器输入文件中的类似组,hadoop,apache-pig,Hadoop,Apache Pig,我有一个Pig任务,每天跟踪一些用户帐户,其中每个用户每天都有一些事务。作为流程的一部分,该PIG每天写出按用户分组的事务(使用Avro作为备用) 现在,我希望将每个用户帐户和流程的所有事务分组一周(或更长时间) 我可以像在PIG中那样通过蛮力来实现这一点,但似乎一定有更好的方法,而不是将所有事务展平并重新分组。更详细地说 工作的起点。。。(a)是用户,(b,c)和(d,e)表示两个转换,如do(f,g)和(h,i) 我在 (a,{(b,c),(d,e)}) -- From first fil

我有一个Pig任务,每天跟踪一些用户帐户,其中每个用户每天都有一些事务。作为流程的一部分,该PIG每天写出按用户分组的事务(使用Avro作为备用)

现在,我希望将每个用户帐户和流程的所有事务分组一周(或更长时间)

我可以像在PIG中那样通过蛮力来实现这一点,但似乎一定有更好的方法,而不是将所有事务展平并重新分组。更详细地说

工作的起点。。。(a)是用户,(b,c)和(d,e)表示两个转换,如do(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中是否有一种不同的方法(也许更有效),我将每天的组分组,然后进行扁平化

我试过(但失败了)

集体行动看起来很有希望

(a,{(a,{(b,c),(d,e)}),(a,{(f,g),(h,i)})})
但是我不知道如何在上面的包中展平内部…脚本刚刚让我回到我开始的地方…我在展平上尝试了许多变体,但都没有成功(主要是产生清管器错误)

这是我通过上面的脚本得到的(而不是我想要的)

作为猪的新手,我能让猪压平内袋,接近我想要的东西吗:

(a,{(b,c),(d,e),(f,g),(h,i)})  
菲尔

你试过“蛮力”吗方法,并将资源消耗与您(例如,
分组
)时得到的资源消耗进行比较,然后忘记尝试将事务放入单个包中?您可能不会发现蛮力方法很优雅,但请思考它在做什么,以及它是否真的有很多低效

理想的方法是按用户分组并合并所有分组的数据包。这意味着将每个输入记录的密钥和事务包发送给某个缩减器。从那里开始,您必须遍历数据包,取出每个事务并将其放入该用户的最终数据包中

蛮力方法使用
展平
,这样对于每个输入记录中的每个事务,您都会将密钥和事务发送到某个缩减器。通过重复发送用户ID,这里会有一些重复,但这并不是什么大问题,特别是当您的事务数据的大小远远大于您的用户大小时从那里,您只需将每笔交易添加到该用户的最后一个包中

对我来说,这听起来并不是特别低效,也不涉及任何额外的map reduce步骤。从映射器发送到reducer的数据的大小非常接近。我怀疑,通过在整个计算机中将一天的事务分组在一起,您不会显著提高性能反倾销

(a,{(b,c),(d,e)})
(a,{(f,g),(h,i)})
(a,{(b,c),(d,e),(f,g),(h,i)})