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

我面临两个问题:

  • 报告文件

    我正在生成猪报告。其输出进入几个文件:part-r-00000,part-r-00001,。。。(这是由于相同的关系,只有多个映射程序生成数据。因此有多个文件。):

    我希望所有这些都在一个报告中结束,所以我最后要做的是,在使用
    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';
    
    是否有更好的方法生成单个文件输出

  • 分组

    我有几个报告执行group by:
    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,要么您在包含的伪代码中遗漏了一些内容。例如,您没有在伪代码中按多个列进行分组;这没关系,但你可能会错过其他东西。