如何指定tab作为hadoop输入文本文件的记录分隔符?
我的 hadoop M/R 作业的输入文件是一个文本文件,其中记录由制表符“\t”而不是换行符“\n”分隔。我如何指示hadoop使用制表符进行拆分,因为默认情况下它会围绕换行符进行拆分,并且文本文件中的每一行都被视为一条记录。
一种方法是使用自定义输入格式类,该类使用过滤器流将原始流中的所有选项卡转换为换行符。但这看起来并不优雅。
另一种方法是使用 java.util.Scanner 并以制表符作为分隔符。但我不知道如何在输入格式类中使用 java.util.Scanner 类。
最好的方法和替代方案是什么?
The input file to my hadoop M/R job is a text file in which the records are separated by tab character '\t' instead of newline '\n'. How can I instruct hadoop to split using the tab character as by default it splits around newlines and each line in the text file is taken as a record.
One way to do it is to use a custom input format class that uses a filter stream to convert all tabs in the original stream to newlines. But this does not look elegant.
Another way would be to use java.util.Scanner
with tab as the separator. But I cannot figure out how to use the java.util.Scanner
class in the input format classes.
What is the best approach and alternatives?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
值 '\r' 和 '\n' 硬编码在 org.apache.hadoop.util.LineReader 类中,因此您不能将 TextInputFormat 与制表符分隔的记录一起使用。但使用特殊的 LineReader 类实现自己的 InputFormat 并不困难。最简单的解决方案是复制粘贴 TextInputFormat、LineRecordReader 和 LineReader 类,将它们移至包中并更改 LineReader 实现。
Values '\r' and '\n' hard-coded in org.apache.hadoop.util.LineReader class, so you can't use TextInputFormat with tab-separated records. But it is not difficult to implement own InputFormat with special LineReader class. The simplest solution is to copy-paste TextInputFormat, LineRecordReader and LineReader classes, move them to your package and change LineReader implementation.