我面临两个问题:
报告文件
我正在生成 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(',');
有没有更好的方法来生成单个文件输出?
通过...分组
我有几个执行分组的报告:
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...