使用map reduce作业将hdfs文本文件转换为镶木地板格式

时间:2015-12-10 17:32:46

标签: java mapreduce parquet

我正在尝试使用java中的map reduce将hdfs文本文件转换为Parquet格式。老实说,我是这个的首发,我找不到任何直接的参考。

转换应该是textfile - > avro --->实木复合地板??

1 个答案:

答案 0 :(得分:9)

文本文件(无论是否为HDFS)没有固有的文件格式。使用Map / Reduce时,您需要一个Avro Schema和一个映射器函数来解析输入,以便您可以创建Avro GenericRecord

你的mapper类看起来像这样。

public class TextToAvroParquetMapper
        extends Mapper<LongWritable, Text, Void, GenericRecord> {
    private GenericRecord myGenericRecord = new GenericData.Record(mySchema);

    @Override
    protected void map(LongWritable key, Text value, Context context) {
          // Parse the value yourself here,
          // calling "put" on the Avro GenericRecord,
          // once for each field.  The GenericRecord
          // object is reused for every map call.
          context.write(null, myGenericRecord);
    }
}

输入键/值对类型是Hadoop的LongWritableText,输出键/值对类型是Void(空键)和Avro GenericRecord本身。

run方法中,像往常一样设置Job配置,包括输入路径,输出路径和映射器类。将reduce任务的数量设置为0,因为这是一个仅限地图的作业。

job.setNumReduceTasks(0);

将输出格式类设置为Parquet的{​​{1}}类,将您创建的AvroParquetOutputFormat Avro转换为GenericRecord列格式。它需要知道您的Avro Schema

Parquet

由于job.setOutputFormatClass(AvroParquetOutputFormat.class); AvroParquetOutputFormat.setSchema(job, myAvroSchema); 将Avro AvroParquetOutputFormat转换为Parquet GenericRecord对象,因此您需要将输出值类设置为Group(并将输出键类设置为Group,因为密钥都是Void)。

null

是的,转换是textfile - &gt; Avro - &gt;实木复合地板。您的job.setOutputKeyClass(Void.class); job.setOutputValueClass(Group.class); 方法控制从文本文件到Avro的转换,map处理从Avro到Parquet的转换。