我正在尝试使用java中的map reduce将hdfs文本文件转换为Parquet格式。老实说,我是这个的首发,我找不到任何直接的参考。
转换应该是textfile - > avro --->实木复合地板??
答案 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的LongWritable
和Text
,输出键/值对类型是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的转换。