我正在尝试使用java中的map reduce将hdfs文本文件转换为Parquet格式.老实说,我是这个的首发,我无法找到任何直接的参考.
转换应该是textfile - > avro ---> parquet ..?
文本文件(无论是否为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的LongWritable
和Text
,并且输出键/值对类型Void
(null键)和阿夫罗GenericRecord
本身.
在该run
方法中,Job
照常设置配置,包括输入路径,输出路径和映射器类.将reduce任务数设置为0,因为这是一个仅限映射的作业.
job.setNumReduceTasks(0);
将输出格式类设置为Parquet
's AvroParquetOutputFormat
class,它将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的转换.