在Hadoop中,常用的TextInputFormat是以換行符作為Record分隔符的。 在實際應用中,我們經(jīng)常會出現(xiàn)一條Record中包含多行的情況,例如: doc..../doc 此時,需要拓展TextInputFormat以完成這個功能。 先來看一下原始實現(xiàn): public class TextInputFormat exte
在Hadoop中,常用的TextInputFormat是以換行符作為Record分隔符的。
在實際應用中,我們經(jīng)常會出現(xiàn)一條Record中包含多行的情況,例如:
....
此時,需要拓展TextInputFormat以完成這個功能。
先來看一下原始實現(xiàn):
public class TextInputFormat extends FileInputFormat{ @Override public RecordReader createRecordReader(InputSplit split, TaskAttemptContext context) { // By default,textinputformat.record.delimiter = ‘/n’(Set in configuration file) String delimiter = context.getConfiguration().get( "textinputformat.record.delimiter"); byte[] recordDelimiterBytes = null; if (null != delimiter) recordDelimiterBytes = delimiter.getBytes(); return new LineRecordReader(recordDelimiterBytes); } @Override protected boolean isSplitable(JobContext context, Path file) { CompressionCodec codec = new CompressionCodecFactory(context.getConfiguration()).getCodec(file); return codec == null; } }
根據(jù)上面的代碼, 不難發(fā)現(xiàn),換行符實際上是由”textinputformat.record.delimiter”這個配置決定的。
所以我們有種解決方案:
(1) 在Job中直接配置textinputformat.record.delimiter為”\n”,這種方案是比較Hack的,很容易影響到其他代碼的正常執(zhí)行。
(2) 繼承TextInputFormat,在return LineRecordReader時,使用自定義的分隔符。
本文采用第二種方案,代碼如下:
public class DocInputFormat extends TextInputFormat { private static final String RECORD_DELIMITER = "\n"; @Override public RecordReadercreateRecordReader( InputSplit split, TaskAttemptContext tac) { byte[] recordDelimiterBytes = null; recordDelimiterBytes = RECORD_DELIMITER.getBytes(); return new LineRecordReader(recordDelimiterBytes); } @Override public boolean isSplitable(JobContext context, Path file) { CompressionCodec codec = new CompressionCodecFactory( context.getConfiguration()).getCodec(file); return codec == null; } }
需要指出的是,InputFormat只是把原始HDFS文件分割成String的記錄,如果你的
?
原文地址:如何拓展Hadoop的InputFormat為其他分隔符, 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com