【问题标题】:Problems generating ordered files in Pig在 Pig 中生成有序文件的问题
【发布时间】:2013-10-03 18:31:34
【问题描述】:

我面临两个问题:

  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。换句话说,我将 reducer 的数量强制为 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...
    

【问题讨论】:

  • 请看我的新答案。顺便说一句,我不想​​挑剔,但它是“伪代码”,而不是“sudo-code”(除非您指的是使用超级用户权限执行的代码!)。
  • 您使用的是自定义分区器吗?这可能会影响您的结果;详情见我的回答。
  • @cabad - 我确实看到了你的更新,我没有使用自定义分区器。我按多列分组...仅此而已。
  • 嗯,你描述的结果不是猪的工作方式。因此,要么您遇到了错误,要么您在包含的伪代码中遗漏了某些内容。例如,您没有在伪代码中按多列进行分组;这无关紧要,但您可能会缺少其他东西。

标签: hadoop apache-pig


【解决方案1】:

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

1) 不,您描述它的方式是 Pig 中唯一的方式。如果您想下载(排序的)文件,只需执行hdfs dfs -cathdfs dfs -getmerge 即可。但是,对于 HBase,如果使用 HBaseStorage 的 -loadKey=true 选项,则不需要进行额外的排序。我还没有尝试过,但是请尝试一下,如果它有效,请告诉我。

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

旧答案:

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

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

方法如下:

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

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

【讨论】:

  • 谢谢@cabad...我会试一试-我还用伪脚本编辑了原始帖子。
  • 您好尝试遵循您的建议,但它并不真正适用于我的问题。我会更新问题以更好地反映我的情况...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多