Hdfs文本文件到镶木地板格式使用地图减少作业



我正在尝试使用java中的map reduce将hdfs文本文件转换为Parquet格式。老实说,我是这方面的初学者,找不到任何直接的参考资料。

转换是否应为textfile-->avro--->parquet?

文本文件(无论是否为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);

将输出格式类设置为ParquetAvroParquetOutputFormat类,该类将创建的Avro GenericRecord转换为Parquet列格式。它需要知道你的Avro Schema

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的转换。

相关内容

  • 没有找到相关文章

最新更新