hadoop 2.4.0使用TAB作为分隔符的流通用解析器选项

时间:2015-05-27 18:57:07

标签: python hadoop utf-8 mapreduce hadoop-streaming

我知道该标签是字段的默认输入分隔符:

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))

我的映射器将键/值对发出为: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 - remove trailing tab from reducer output开始,我了解到尾随空格是由mapreduce.textoutputformat.separator未设置而保留为默认值。

所以,这证实了我的假设,即hadoop考虑了我的总地图输出:

key value1 value2

作为键和值为空文本对象,因为它从stream.map.output.field.separator=\t读取分隔符为“\ t”字符而不是“”制表符空间本身。

请帮助我理解这种行为,如果我愿意,如何使用\ t作为分隔符。

1 个答案:

答案 0 :(得分:1)

您可能遇到此问题“ - D stream.map.output.field.separator =。”指定“。”作为地图输出的字段分隔符,以及直到第四个“。”的前缀。在一行中将是键,行的其余部分(不包括第四个“。”)将是值。如果一行少于四个“。”,则整行将成为键,值将为空文本对象(如新文本(“”)创建的那个)。 {{3清楚地提到了如何使用分隔符,以及在识别地图键和值时需要考虑多少这样的分隔符出现。还有与分区相关的字段,基于该字段将处理reducer。你想要更改分隔符,我想,你必须验证这也与分区和reducer有关。