【发布时间】:2013-10-03 18:31:34
【问题描述】:
我面临两个问题:
-
报告文件
我正在生成 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(',');有没有更好的生成单个文件输出的方法?
-
分组方式
我有几个执行分组的报告:
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