hadoop流api:如何删除不需要的分隔符

dsekswqp  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(355)

假设我有一个关于hdfs的文件:
1
2
3
我要把它改造成

b
c
我写了一个mapper.py:


# !/usr/bin/python

import sys
for line in sys.stdin:
    print chr(int(line) + ord('a') - 1)

然后使用流式api:
hadoop jar$hadoop\u home/contrib/streaming/hadoop streaming-*.jar
-mapper mapper.py-文件mapper.py-输入/输入-输出/输出
但输入/输出的结果是“a\t\nb\t\nc\t\n”:
一个\t
备份\t
更改\t
注意那些额外的不可打印的制表符,我用了'\t'代替。记录如下:
如果行中没有制表符,则整行视为键,值为空。
因此,这些选项卡是通过流式api作为分隔符添加的。但是无论我如何修改与分隔符相关的选项,我都不能使它消失。
因此,我的问题是,有没有一种方法可以把这项工作干净利落,而不需要额外的东西,比如标签?
或者更清楚地说,有没有一种方法可以将hadoop仅仅用作分布式过滤器,而忽略其键/值机制?

更新@2013.11.27
正如我和朋友讨论的那样,实现这个目标并不容易,我在输出中使用tab作为字段分隔符,并在hive中将tab设置为字段分隔符,从而解决了这个问题。
我的一些朋友提议使用 -D mapred.textoutputformat.ignoreseparator=true ,但这个参数就是不起作用。我调查了这个文件:

hadoop-1.1.2/src/mapred/org/apache/hadoop/mapred/TextOutputFormat.java

没有找到选择。但作为替代方案,流式api接受一个参数 -outputformat 它指定了另一种输出格式。
根据本文,您可以复制textoutputformat.java,删除默认的'\t',编译它,然后将其打包为jar,并使用 -libjars yourjar.jar -outputformat path.to.your.outputformat . 但是我在hadoop-1.1.2中没有成功。把这个写下来供别人参考。

thigvfpy

thigvfpy1#

您应该能够通过指定您的作业是一个仅Map的作业来摆脱这些分隔符—这本质上就是您希望成为分布式过滤器的内容,Map器的输出将是最终输出。
要在hadoop流中执行此操作,可以使用以下选项:

-D mapred.reduce.tasks=0

所以对于完整的命令,这看起来像:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-*.jar -D mapred.reduce.tasks=0 -mapper mapper.py -file mapper.py -input /input -output /output

相关问题