了解Hadoop数据类型,输入输出格式及用户如何自定义。

本文详细介绍了Hadoop内置的数据类型,包括它们的可序列化和比较特性。接着,讨论了如何自定义数据类型,需实现Writable和WritableComparable接口。此外,还阐述了Hadoop的数据输入格式如TextInputFormat和KeyValueInputFormat及其RecordReader的作用。数据输出格式如TextOutputFormat以及RecordWriter的工作原理也被提及。最后,通过一个简单的UserInfo案例,展示了如何自定义数据类型、输入格式和输出格式。
摘要由CSDN通过智能技术生成

一:Hadoop内置的数据类型。

    Hadoop提供如下内置的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。

BooleanWritable 标准布尔型数值
ByteWritable 单字节数值
DoubleWritable 双字节数
FloatWritable 浮点数
IntWritable 整型数
LongWritable 长整型数
Text 使用UTF-8格式存储的文本
NullWritable 当<key,value>中的key或value为空时使用
//简单知道这些类型
IntWritable iw = new IntWritable(1);
System.out.println(  iw.get() );  // 1 
	
BooleanWritable bw = new BooleanWritable(true);
System.out.println(  bw.get() );  // true

二:Hadoop-用户自定义的数据类型。

    自定义数据类型时,需满足两个基本要求,即

        1.实现Writable接口,以便该数据能被序列化后完成网络传输或文件输入/输出。

        2.如果该数据需要作为主键key使用,或需要比较数值大小时,则需要实现WritableComparable接口。

//Hadoop2.6.4版 - Writable源码:
public interface Writable {
 
  void write(DataOutput out) throws IOException;

  void readFields(DataInput in) throws IOException;

}
public interface WritableComparable<T> extends Writable, Comparable<T> {}

三:Hadoop内置的数据输入格式和RecordReader。

    数据输入格式(InputFormat)用于描述MapReduce作业的数据输入规范。MapReduce框架依靠数据输入格式完成输入规范检查、对数据文件进行输入分块(InputSplit),以及提供从输入分块中将数据记录逐一读出、并转换为Map过程的输入键值对等功能。

    Hadoop提供了丰富的内置数据输入格式,最常用的数据输入格式包括:TextInputFormat 和 KeyValueInputFormat。

    TextInputFormat是系统默认的数据输入格式,可以将文本文件分块并逐行读入以便Map节点进行处理。读入一行时,所产生的主键key就是当前行在整个文本文件中的字节偏移位置,而value就是该行的内容。

//TextInputFormat部分源码:
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {

  @Override
  public RecordReader<LongWritable, Text> 
    createRecordReader(InputSplit split,
                       TaskAttemptContext context) {
    String delimiter = context.getConfiguration().get(
        "textinputformat.record.delimiter");
    byte[] recordDelimiterBytes = null;
    if (null != delimiter)
      recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
    return new LineRecordReader(recordDelimiterBytes);
  }

  //....
}

    KeyValueTextInputFormat是另一个常用的数据输入格式,可将一个按照<key,value>格式逐行存放的文本文件逐行读出,并自动解析生成相应的key和value。

//KeyValueTextInputFormat部分源码:
public class KeyValueTextInputFormat extends FileInputFormat<Text, Text> {

  // ...

  public RecordReader<Text, Text> createRecordReader(InputSplit genericSplit,
      TaskAttemptContext context) throws IOException {
    
    context.setStatus(genericSplit.toString());
    return new KeyValueLineRecordReader(context.getConfiguration());
  }

}

    RecordReader对于一个数据输入格式,都需要有一个对应的RecordReader,主要用于将一个文件中的数据记录拆分成具体的键值对。TextInputFormat的默认RecordReader是LineRecordReader,而KeyValueTextInputFormat的默认RecordReader是KeyValueLineRecordReader。

四:Hadoop内置的数据输出格式与RecordWriter。

    数据输出格式(OutputFormat)用于描述MapReduce作业的数据输出规范。MapReduce框架依靠数据输出格式完成输出规范检查以及提供作业结果数据输出功能。

    同样,最常用的数据输出格式是TextOutputFormat,也是系统默认的数据输出格式,可以将计算结果以 “key + \t + vaue”的形式逐行输出到文本文件中。

    与数据输入格式类似样,数据输出格式也提供一个对应的RecordWriter,以便系统明确输出结果写入到文件中的具体格式。TextInputFormat的默认RecordWriter是LineRecordWriter,其实际操作是将结果数据以“key + \t + value”的形式输出到文本文件中。

//TextOutputFormat的部分源码:
public class TextOutputFormat<K, V> extends File
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值