gpt4 book ai didi

java - 使用 map reduce 作业将 Hdfs 文本文件转换为 Parquet 格式

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:18 27 4
gpt4 key购买 nike

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

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

最佳答案

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

您的映射器类看起来像这样。

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,因为这是一个 map-only 作业。

job.setNumReduceTasks(0);

将输出格式类设置为ParquetAvroParquetOutputFormat类,它将AvroGenericRecord转换为你创建成 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);

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

关于java - 使用 map reduce 作业将 Hdfs 文本文件转换为 Parquet 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com