我知道选项卡是字段的默认输入分隔符:
stream.map.output.field.separator
stream.reduce.input.field.separator
stream.reduce.output.field.separator
mapreduce.textoutputformat.separator
但如果我尝试编写通用解析器选项:
stream.map.output.field.separator=\t (or)
stream.map.output.field.separator="\t"
测试hadoop在用作分隔符时如何解析诸如“\t、\n、\f”之类的空白字符。我注意到hadoop将其读取为\t字符,而不是“
“选项卡空间本身。我通过在reducer(python)中打印每一行来检查它,因为它使用:
sys.stdout.write(str(line))
我的Map器发出键/值对,如下所示: key value1 value2
使用 print (key,value1,value2,sep='\t',end='\n')
命令。
所以我希望我的减速机把每一行都读成: key value1 value2
我也是,但是 sys.stdout.write(str(line))
印刷的: key value1 value2 \\with trailing space
从hadoop streaming-removetrailingtabfromcreducer输出中,我了解到尾部空间是由于 mapreduce.textoutputformat.separator
未设置并保留为默认值。
因此,这证实了我的假设,即hadoop考虑了我的总Map输出: key value1 value2
作为键和值作为空文本对象,因为它从中读取分隔符 stream.map.output.field.separator=\t
作为“\t”字符而不是
“选项卡空间本身。
请帮助我了解此行为,以及如何使用\t作为分隔符。
1条答案
按热度按时间vxf3dgd41#
您可能遇到此问题“-d stream.map.output.field.separator=”指定“.”作为Map输出的字段分隔符,行中第四个“.”之前的前缀将是键,行的其余部分(不包括第四个“.”)将是值。如果一行少于四个“.”,那么整行将是键,值将是一个空文本对象(如新文本(“”)创建的对象)。这里清楚地提到了如何使用分隔符,以及在标识Map键和值时需要考虑的分隔符出现次数。此外,还有一些与分区相关的字段,根据这些字段处理reducer。我认为,当您希望更改分隔符时,您必须验证这也与分区和减速机有关。