猪负载与分割和共同组和数量的映射



我注意到,当我在加载后的pig脚本中引入'SPLIT'和'COGROUP'语句时,pig作业中的映射器数量增加了一倍。这是正确的吗?有人知道为什么会这样吗?

我使用PigStorage:

加载数据集
A = LOAD 'test.csv' USING PigStorage;
cat test.csv
A   123
A   345
B   234
B   123

然后使用split将数据集拆分为两个关系(使用过滤器的结果是相同的)。然后,我将这两个关系组合为一个,并存储它。

SPLIT A INTO AA IF $0 == 'A', AB IF $0 == 'B';
CG = COGROUP AA BY $1, AB BY $1;
STORE CG INTO 'cg' USING PigStorage();
当我这样做时,我可以从我的(本地)输出中看到以下行:
Success!
Job Stats (time in seconds):
JobId   Alias   Feature Outputs
job_local_0001  A,AA,AB,CG  COGROUP /test/cg,
Input(s):
Successfully read records from: "/test/test.csv"
Successfully read records from: "/test/test.csv"

输出(s):成功存储记录:"/test/cg"

所以看起来数据被读了两次。实际上,我可以看到在集群上映射器的数量翻倍。

是什么导致了这种行为?有没有办法避免它,或者它有一个很好的理由让我错过?

这取决于您如何使用AA, AB以及如何运行脚本。

  • 如果您在脚本或grunt中编写dump AA; dump AB;,则会有两个作业。
  • 如果你在grunt中写store AA into '...'; store AB into '...';,也会有两个作业。

但是,如果您在脚本中写入store AA into '...'; store AB into '...';,并使用Pig运行该脚本(而不是grunt中的),则只有一个作业。

这将避免双重文件读取

A = LOAD 'test.csv' USING PigStorage(',');
B = GROUP A by $1;
C = FOREACH B {
      AA = FILTER A by $0 == 'A';
      BB= FILTER A by $0 == 'B';
GENERATE FLATTEN($0), AA,BB;};
dump C;

最新更新