使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)

Posted

技术标签:

【中文标题】使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)【英文标题】:Json object to Parquet format using Java without converting to AVRO(Without using Spark, Hive, Pig,Impala) 【发布时间】:2017-02-13 00:09:33 【问题描述】:

我有一个场景,使用 Java 将作为 Json 对象存在的消息转换为 Apache Parquet 格式。任何示例代码或示例都会有所帮助。至于我发现将消息转换为 Parquet 的内容,正在使用 Hive、Pig、Spark。我需要转换为 Parquet,而无需仅通过 Java 参与这些。

【问题讨论】:

提前致谢.... 您好 Vijju,我想实现相同的解决方案,如果您已成功实现上述解决方案,请提供示例代码。其实我有点困惑。谢谢。 【参考方案1】:

要将 JSON 数据文件转换为 Parquet,您需要一些内存表示。 Parquet 没有自己的 Java 对象集。相反,它重用了其他格式的对象,例如 Avro 和 Thrift。这个想法是 Parquet 可以与您的应用程序可能已经使用的对象一起工作。

要转换 JSON,您需要将记录转换为 Avro内存中的对象并将它们传递给 Parquet,但您不需要将文件转换为 Avro,然后再转换为 Parquet。

已经为您完成了到 Avro 对象的转换,请参阅 Kite's JsonUtil,并且可以用作 file reader。转换方法需要 Avro 架构,但您可以使用相同的库来 infer an Avro schema from JSON data。

要写入这些记录,您只需要使用ParquetAvroWriter。整个设置如下所示:

Schema jsonSchema = JsonUtil.inferSchema(fs.open(source), "RecordName", 20);
try (JSONFileReader<Record> reader = new JSONFileReader<>(
                    fs.open(source), jsonSchema, Record.class)) 

  reader.initialize();

  try (ParquetWriter<Record> writer = AvroParquetWriter
      .<Record>builder(outputPath)
      .withConf(new Configuration)
      .withCompressionCodec(CompressionCodecName.SNAPPY)
      .withSchema(jsonSchema)
      .build()) 
    for (Record record : reader) 
      writer.write(record);
    
  

【讨论】:

如何使 schema 生成的字段可选,不是必需的?【参考方案2】:

我遇到了同样的问题,据我所知,如果不使用 avro 或其他框架,可用于拼花写入的示例并不多。最后我和Avro一起去了。 :)

看看this,可能对你有帮助。

【讨论】:

以上是关于使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么将对象转换成json字符串

使用 Jackson 将 Java 对象转换为 JSON

JackSon将java对象转换为JSON字符串

将JSON格式的字符串转换为Java中的JSON对象[重复]

如何将swagger JSON对象转换为Java类对象

无法使用 Spring Boot Rest 服务将 JSON 转换为 Java 对象