Hadoop 清管器负载(带有拆分和协同组)和映射器数量

Hadoop 清管器负载(带有拆分和协同组)和映射器数量,hadoop,apache-pig,Hadoop,Apache Pig,我注意到,在加载后,当我在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

我注意到,在加载后,当我在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"
输出: 已成功将记录存储在“/test/cg”中

看起来数据被读取了两次。事实上,我可以看到,在一个集群上,地图绘制者的数量翻了一番


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

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

  • 如果你写
    转储AA;转储AB
    
  • 如果你写
    将AA存储到“…”;将AB存储到“…”grunt中,也将有两个作业

但是,如果您编写
将AA存储到“…”;将AB存储到“…”并使用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;

谢谢你,你让我意识到我没有正确地再现我给出的例子中的问题。加载和拆分后添加COGROUP,然后存储时,映射器的数量会加倍。我将编辑问题以反映它。