使用 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)的主要内容,如果未能解决你的问题,请参考以下文章