Hadoop 在Pig中生成有序文件时出现问题
我面临两个问题:Hadoop 在Pig中生成有序文件时出现问题,hadoop,apache-pig,Hadoop,Apache Pig,我面临两个问题: 报告文件 我正在生成猪报告。其输出进入几个文件:part-r-00000,part-r-00001,。。。(这是由于相同的关系,只有多个映射程序生成数据。因此有多个文件。): 我希望所有这些都在一个报告中结束,所以我最后要做的是,在使用hbastorage存储结果之前,我使用parallel 1:report=ORDER report BY col1 parallel 1对它们进行排序。换言之,我强制将还原数设置为1,因此生成一个文件,如下所示: B = FOREACH A G
hbastorage
存储结果之前,我使用parallel 1:report=ORDER report BY col1 parallel 1
对它们进行排序。换言之,我强制将还原数设置为1,因此生成一个文件,如下所示:
B = FOREACH A GENERATE col1,col2,col3;
B = ORDER B BY col1 PARALLEL 1;
STORE B INTO $output USING PigStorage(',');
C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge';
是否有更好的方法生成单个文件输出GROUBLED=group data by col
,除非我提到parallel 1
,有时PIG决定使用几个减缩器对结果进行分组。当我对数据求和或计数时,得到的结果不正确。例如:
而不是看到这一点:
part-r-00000:
grouped_col_val_1, 5, 6
grouped_col_val_2, 1, 1
part-r-00001:
grouped_col_val_1, 3, 4
grouped_col_val_2, 5, 5
我应该看到:
part-r-00000:
grouped_col_val_1, 8, 10
grouped_col_val_2, 6, 6
因此,我最终按如下方式进行分组:grouped=按col PARALLEL 1分组数据
然后我看到了正确的结果
我觉得我错过了什么
下面是我如何进行分组的伪代码:
raw = LOAD '$path' USING PigStorage...
row = FOREACH raw GENERATE id, val
grouped = GROUP row BY id;
report = FOREACH grouped GENERATE group as id, SUM(val)
STORE report INTO '$outpath' USING PigStorage...
根据您提供的额外详细信息编辑,新答案: 1) 不,你描述它的方式是用猪做的唯一方式。如果要下载(排序)文件,只需执行
hdfs-dfs-cat
或hdfs-dfs-getmerge
即可。但是,对于HBase,如果使用HBasStorage的-loadKey=true
选项,则不需要进行额外排序。我还没有试过,但请尝试一下,让我知道它是否有效
2) 不需要并行1。如果这对您不起作用,我怀疑您的伪代码不完整。您正在使用自定义分区器吗?这是我对您的结果所能找到的唯一解释,因为
groupby
使用的默认分区器将键的所有实例发送到同一个reducer,从而提供您期望的结果
旧答案:
1) 您可以使用合并联接,而不仅仅是一个减速器。从:
通常,存储用户数据时,两个输入都已在join键上排序。在这种情况下,可以在MapReduce作业的映射阶段加入数据。与通过不必要的排序和洗牌阶段传递所有数据相比,这提供了显著的性能改进
方法如下:
B = FOREACH A GENERATE col1,col2,col3;
B = ORDER B BY col1 PARALLEL 1;
STORE B INTO $output USING PigStorage(',');
C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge';
2) 您不需要使用
PARALLEL 1
来获得所需的结果。无论使用多少减速器,组
都可以正常工作。你能发布你用于案例2的脚本的代码吗?谢谢@cabad…我会尝试一下-我也用psudo-script编辑了原始的帖子。你好,我试着听从你的建议,但这并不适用于我的问题。我将更新问题以更好地反映我的情况…请查看我的新答案。顺便说一句,我不想吹毛求疵,但它是“伪代码”,而不是“sudo代码”(除非您指的是使用超级用户权限执行的代码!)。您使用的是自定义分区器吗?这可能会影响你的结果;有关详细信息,请参阅我的答案。@cabad-我确实看到了您的更新,我没有使用自定义分区器。我按多个列进行分组……仅此而已。好吧,你描述的结果不是pig的工作原理。因此,要么您遇到了一个bug,要么您在包含的伪代码中遗漏了一些内容。例如,您没有在伪代码中按多个列进行分组;这没关系,但你可能会错过其他东西。