最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

如何拓展Hadoop的InputFormat為其他分隔符

來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 12:59:15
文檔

如何拓展Hadoop的InputFormat為其他分隔符

如何拓展Hadoop的InputFormat為其他分隔符:在Hadoop中,常用的TextInputFormat是以換行符作為Record分隔符的。 在實際應用中,我們經(jīng)常會出現(xiàn)一條Record中包含多行的情況,例如: doc..../doc 此時,需要拓展TextInputFormat以完成這個功能。 先來看一下原始實現(xiàn): public class Tex
推薦度:
導讀如何拓展Hadoop的InputFormat為其他分隔符:在Hadoop中,常用的TextInputFormat是以換行符作為Record分隔符的。 在實際應用中,我們經(jīng)常會出現(xiàn)一條Record中包含多行的情況,例如: doc..../doc 此時,需要拓展TextInputFormat以完成這個功能。 先來看一下原始實現(xiàn): public class Tex

在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 RecordReader createRecordReader(
	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的記錄,如果你的 內(nèi)有其他結構化數(shù)據(jù),那么需要在map中自己實現(xiàn)deserilize的相關業(yè)務邏輯來處理。

?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

如何拓展Hadoop的InputFormat為其他分隔符

如何拓展Hadoop的InputFormat為其他分隔符:在Hadoop中,常用的TextInputFormat是以換行符作為Record分隔符的。 在實際應用中,我們經(jīng)常會出現(xiàn)一條Record中包含多行的情況,例如: doc..../doc 此時,需要拓展TextInputFormat以完成這個功能。 先來看一下原始實現(xiàn): public class Tex
推薦度:
標簽: 如何 分隔 其他
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top