avro - 将 JSON 转换为 Parquet

标签 avro parquet

我有几个 TB 的 JSON 格式的日志数据,我想将它们转换成 Parquet 格式以便在分析阶段获得更好的性能。

我已经设法通过编写一个使用 parquet-mr 的 mapreduce java 作业来做到这一点和 parquet-avro .

我唯一不满意的是,我的 JSON 日志没有固定的架构,我不知道所有字段的名称和类型。此外,即使我知道所有字段的名称和类型,我的架构也会随着时间的推移而发展,例如,将来会添加新的字段。

现在我必须为 AvroWriteSupport 提供一个 Avro 模式,而 avro 只允许固定数量的字段。

有没有更好的方法在 Parquet 中存储任意字段,就像 JSON 一样?

最佳答案

可以肯定的是,Parquet 需要提前使用 Avro 架构。我们将专注于如何获取模式。

  1. 使用 SparkSQL 将 JSON 文件转换为 Parquet 文件。

    SparkSQL 可以自动从数据中推断出模式,因此我们不需要自己提供模式。每次数据发生变化时,SparkSQL 都会推断出不同的模式。

  2. 手动维护 Avro 模式。

    如果您不使用 Spark 而只使用 Hadoop,则需要手动推断架构。首先编写一个 mapreduce 作业来扫描所有 JSON 文件并获取所有字段,在你知道所有字段之后你可以编写一个 Avro 模式。使用此模式将 JSON 文件转换为 Parquet 文件。

    以后还会有新的未知字段,每次有新的字段,就添加到Avro schema中。所以基本上我们是手动完成 SparkSQL 的工作。

关于avro - 将 JSON 转换为 Parquet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33028272/

相关文章:

hadoop - parquet、avro 和其他 hadoop 文件格式的第一行可以有不同的布局吗?

python - 如何将 .parquet 文件从本地计算机上传到 Azure Storage Data Lake Gen2?

hadoop - HDFS “files”是目录

apache-spark - Spark Structured Streaming 写入 Parquet 会创建如此多的文件

apache-spark - parquet支持哪些压缩类型

hadoop - pcap 到 Hadoop 上的 Avro

java - java中Avro不可变生成的类

parquet - 在单个多核机器上索引大型 dask 数据帧时的内存使用情况

java - 使用Spark-Java读取存储在HDFS中的Avro表和架构

java - 如何解决Kafka Avro反序列化问题