假设我有一个关于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中没有成功。把这个写下来供别人参考。
1条答案
按热度按时间thigvfpy1#
您应该能够通过指定您的作业是一个仅Map的作业来摆脱这些分隔符—这本质上就是您希望成为分布式过滤器的内容,Map器的输出将是最终输出。
要在hadoop流中执行此操作,可以使用以下选项:
所以对于完整的命令,这看起来像: