Pig:每个输入行/行强制一个映射器



我有一个Pig Streaming作业,其中映射器的数量应该等于输入文件中的行/行数。我知道这个设置

set mapred.min.split.size 16 
set mapred.max.split.size 16
set pig.noSplitCombination true 

将确保每个块为16字节。但是如何确保每个map作业只有一行作为输入呢?线的长度是可变的,所以对mapred.min.split.sizemapred.max.split.size使用一个常数不是最好的解决方案。

下面是我打算使用的代码:

input = load 'hdfs://cluster/tmp/input';
DEFINE CMD `/usr/bin/python script.py`;
OP = stream input through CMD;
dump OP;

解决!感谢zsxwing

并且,如果其他人遇到这个奇怪的废话,知道这个:

要确保Pig为每个输入文件创建一个映射器,必须设置

set pig.splitCombination false

set pig.noSplitCombination true

为什么会这样,我不知道!

根据你的提示,我浏览了Pig的源代码来寻找答案。

设置pig.noSplitCombination在Pig脚本不工作。在Pig脚本中,您需要使用pig.splitCombination。然后Pig将根据pig.splitCombination的值设置JobConf中的pig.noSplitCombination

如果要直接设置pig.noSplitCombination,需要使用命令行。例如,

pig -Dpig.noSplitCombination=true -f foo.pig

这两种方式的区别在于:如果在Pig脚本中使用set指令,它将被存储在Pig属性中。如果你使用-D,它存储在Hadoop Configuration中。

如果使用set pig.noSplitCombination true,则(猪)。noSplitCombination, true)存储在Pig属性中。但是当Pig想要初始化一个JobConf时,它使用pig.splitCombination从Pig属性中获取值。所以你的设置没有效果。这里是源代码。正确的方法是你提到的set pig.splitCombination false

如果您使用-Dpig.noSplitCombination=true(猪。noSplitCombination, true)存放在Hadoop Configuration中。由于JobConf是从Configuration复制过来的,所以-D的值直接传递给JobConf

最后,PigInputFormat从JobConf中读取pig.noSplitCombination来决定是否使用该组合。以下是源代码

相关内容

  • 没有找到相关文章

最新更新