0

我面临两个问题:

  1. 报告文件

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

    B = FOREACH A GENERATE col1,col2,col3;
    STORE B INTO $output USING PigStorage(',');
    

    我希望所有这些最终都在一份报告中,所以我最终要做的是在使用 存储结果之前HBaseStorage,我使用并行 1: 对它们进行排序report = ORDER report BY col1 PARALLEL1。换句话说,我将减速器的数量强制为 1,因此生成一个文件如下:

    B = FOREACH A GENERATE col1,col2,col3;
    B = ORDER B BY col1 PARALLEL 1;
    STORE B INTO $output USING PigStorage(',');
    

    有没有更好的方法来生成单个文件输出?

  2. 通过...分组

    我有几个执行分组的报告:grouped = 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 = GROUP data BY 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...
    
4

1 回答 1

1

编辑,基于您提供的额外详细信息的新答案:

1)不,你描述它的方式是在 Pig 中做到这一点的唯一方法。如果要下载(排序的)文件,只需执行 ahdfs dfs -cathdfs dfs -getmerge. -loadKey=true但是,对于 HBase,如果您使用HBaseStorage 选项,则不需要进行额外的排序。我还没有尝试过,但请尝试一下,让我知道它是否有效。

2)PARALLEL 1不需要。如果这对您不起作用,我怀疑您的伪代码不完整。您是否使用自定义分区程序?这是我能找到的对您的结果的唯一解释,因为使用的默认分区器GROUP BY将键的所有实例发送到同一个减速器,从而为您提供您期望的结果。

旧答案:

1)您可以使用合并连接而不是仅使用一个减速器。来自Apache Pig 文档

通常存储用户数据时,两个输入都已按连接键排序。在这种情况下,可以在 MapReduce 作业的映射阶段加入数据。与通过不需要的排序和混洗阶段传递所有数据相比,这提供了显着的性能改进。

方法如下:

C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge';

2)你不应该需要使用PARALLEL 1来获得你想要的结果。GROUP无论您使用多少减速器,它都应该可以正常工作。您能否发布您用于案例 2 的脚本代码?

于 2013-10-03T19:07:16.970 回答