当前位置: 首页 > 知识库问答 >
问题:

Parquet-MR AvroParquetWriter-如何将数据转换为Parquet(使用特定映射)

叶浩荡
2023-03-14

我正在开发一种工具,用于将数据从自行开发的格式转换为 Parquet 和 JSON(用于 Spark、Drill 和 MongoDB 的不同设置),使用 Avro 和 Specific Mapping 作为垫脚石。我必须支持定期在客户端计算机上转换新数据,这就是为什么我尝试使用(Avro|编写自己的独立转换工具的原因镶木地板|JSON)切换,而不是使用Drill或Spark或其他工具作为转换器,如果这是一次性工作,我可能会这样做。我把整个事情都建立在Avro的基础上,因为这似乎是在一个引擎盖下转换为镶木地板和JSON的最简单方法。

我使用特定映射从静态类型检查中获利,编写了一个IDL,将其转换为schema.avsc,生成了类并使用特定构造函数设置了示例转换,但现在我无法配置编写器。我能找到的所有Avro-Parque转换示例[0]都使用带有已弃用签名的AvroParquetWriter(主要是:Path文件、Schema Schema)和Generic Map。

AvroParquetWriter只有一个不推荐使用的构造函数,其签名如下:

AvroParquetWriter(
    Path file, 
    WriteSupport<T> writeSupport,
    CompressionCodecName compressionCodecName,
    int blockSize, 
    int pageSize, 
    boolean enableDictionary,
    boolean enableValidation, 
    WriterVersion writerVersion,
    Configuration conf
)

大多数参数不难弄清楚,但WriteSupport

所以我有几个问题:

1)AvroParquetWriter是否不支持Avro特定映射?还是通过 SpecificData.get() 方法实现的?“SpecificData.class”上的注释“用于生成的Java类和接口的实用程序”似乎暗示了这一点,但是我应该如何继续呢?

AvroParquetWriter构造函数中发生了什么,是否有示例或一些文档可以在某处找到?

3)更具体地说:WriteSupport方法的签名要求“Schema avroSchema”和“GenericData model”。通用数据模型指的是什么?也许我没有看到森林,因为这里所有的树木......

举个例子来说明我的目标,我的Avro转换代码的核心部分目前如下所示:

DatumWriter<MyData> avroDatumWriter = new SpecificDatumWriter<>(MyData.class);
DataFileWriter<MyData> dataFileWriter = new DataFileWriter<>(avroDatumWriter);
dataFileWriter.create(schema, avroOutput);

拼花地板目前看起来像这样:

AvroParquetWriter<SpecificRecord> parquetWriter = new AvroParquetWriter<>(parquetOutput, schema);

但这仅仅是一个开始,并且是根据我找到的示例建模的,使用已弃用的构造函数,因此无论如何都必须更改。

谢谢,
托马斯

[0]Hadoop-权威指南,O'Reilly,https://gist.github.com/hammer/76996fb8426a0ada233e,http://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter


共有1个答案

西门嘉澍
2023-03-14

试试AvroParquetWriter.builder:

MyData obj = ... // should be avro Object
ParquetWriter<Object> pw = AvroParquetWriter.builder(file)
        .withSchema(obj.getSchema())
        .build();
pw.write(obj);
pw.close(); 

谢谢。

 类似资料:
  • 我在S3有一些遗留数据,我想使用Spark 2和Java API将它们转换成parquet格式。 我有所需的Avro模式(. avsc文件)及其使用Avro编译器生成的Java类,我想使用这些模式以Parque格式存储数据。输入数据不是任何标准格式,但我有一个库,可以将遗留文件中的每一行转换为Avro类。 是否可以将数据作为

  • Parquet是一种面向列存存储的文件格式,Cloudera的大数据在线分析(OLAP)项目Impala中使用该格式作为列存储。 Apache Parquet 是一个列存储格式,主要用于 Hadoop 生态系统。对数据处理框架、数据模型和编程语言无关。

  • 问题内容: 我有一个场景,其中使用Java将作为Json对象存在的消息转换为Apache Parquet格式。任何示例代码或示例都将有所帮助。据我发现将消息转换为Parquet的内容,正在使用Hive,Pig,Spark。我需要转换为Parquet,而无需Java参与。 问题答案: 要将JSON数据文件转换为Parquet,您需要一些内存表示形式。Parquet没有自己的Java对象集。相反,它重

  • 问题内容: 如何在不设置集群计算基础架构(例如Hadoop或Spark)的情况下,将大小适中的Parquet数据集读取到内存中的Pandas DataFrame中?我只想在笔记本电脑上使用简单的Python脚本在内存中读取这些数据,但是数量很少。数据不驻留在HDFS上。它位于本地文件系统上,也可能位于S3中。我不想启动并配置其他服务,例如Hadoop,Hive或Spark。 我以为Blaze /

  • 如何在不设置集群计算基础设施(如Hadoop或Spark)的情况下将大小适中的Parket数据集读取到内存中的Pandas DataFrame中?这只是我想在笔记本电脑上使用简单的Python脚本在内存中读取的适度数据。数据不驻留在HDFS上。它要么在本地文件系统上,要么可能在S3中。我不想启动和配置其他服务,如Hadoop、Hive或Spark。 我原以为Blaze/Odo会使这成为可能:Odo