hadoop2.4.0使用tab作为分隔符的流通用解析器选项

xzv2uavs  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(442)

我知道选项卡是字段的默认输入分隔符:

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作为分隔符。

vxf3dgd4

vxf3dgd41#

您可能遇到此问题“-d stream.map.output.field.separator=”指定“.”作为Map输出的字段分隔符,行中第四个“.”之前的前缀将是键,行的其余部分(不包括第四个“.”)将是值。如果一行少于四个“.”,那么整行将是键,值将是一个空文本对象(如新文本(“”)创建的对象)。这里清楚地提到了如何使用分隔符,以及在标识Map键和值时需要考虑的分隔符出现次数。此外,还有一些与分区相关的字段,根据这些字段处理reducer。我认为,当您希望更改分隔符时,您必须验证这也与分区和减速机有关。

相关问题