当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用mapreduce作业将hdfs文本文件转换为镶木地板格式》经验,为你挑选了1个好方法。

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

转换应该是textfile - > avro ---> parquet ..?



1> rgettman..:

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

您的mapper类看起来像这样.

public class TextToAvroParquetMapper
        extends Mapper {
    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(null键)和阿夫罗GenericRecord本身.

在该run方法中,Job照常设置配置,包括输入路径,输出路径和映射器类.将reduce任务数设置为0,因为这是一个仅限映射的作业.

job.setNumReduceTasks(0);

将输出格式类设置为Parquet's AvroParquetOutputFormatclass,它将Avro GenericRecord您创建的s转换为Parquet柱状格式.它需要知道你的AvroSchema.

job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, myAvroSchema);

因为AvroParquetOutputFormat将Avro GenericRecord转换为Parquet Group对象,所以您需要将输出值类设置为Group(并将输出键类设置为Void,因为键都是null).

job.setOutputKeyClass(Void.class);
job.setOutputValueClass(Group.class);

是的,转换是textfile - > Avro - > Parquet.您的map方法控制从文本文件到Avro AvroParquetOutputFormat的转换,并处理从Avro到Parquet的转换.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有