• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 4年前 (2022-01-09) 30次浏览 已收录 0个评论

在Hadoop中,常用的TextInputFormat是以换行符作为Record分隔符的。 在实际应用中,我们经常会出现一条Record中包含多行的情况,例如: doc…./doc 此时,需要拓展TextInputFormat以完成这个功能。 先来看一下原始实现: public class TextInputFormat exte

在Hadoop中,常用的TextInputFormat是以换行符作为Record分隔符的。

在实际应用中,我们经常会出现一条Record中包含多行的情况,例如:

....

此时,需要拓展TextInputFormat以完成这个功能。

先来看一下原始实现:

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(r<b>本文来源gao@!dai!ma.com搞$$代^@码!网</b>ecordDelimiterBytes);  }   @Override  protected boolean isSplitable(JobContext context, Path file) {    CompressionCodec codec =      new CompressionCodecFactory(context.getConfiguration()).getCodec(file);    return codec == null;  }}

根据上面的代码, 不难发现,换行符实际上是由”textinputformat.record.delimiter”这个配置决定的。

所以我们有种解决方案:
(1) 在Job中直接配置textinputformat.record.delimiter为”\n”,这种方案是比较Hack的,很容易影响到其他代码的正常执行。
(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的记录,如果你的 内有其他结构化数据,那么需要在map中自己实现deserilize的相关业务逻辑来处理。

?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何拓展Hadoop的InputFormat为其他分隔符

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址