【问题标题】:Convert JSON to Parquet将 JSON 转换为 Parquet
【发布时间】:2016-10-05 15:19:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: avro parquet


    【解决方案1】:

    可以肯定的是,Parquet 需要提前使用 Avro 模式。我们将重点介绍如何获取架构。

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

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

    2. 手动维护 Avro 架构。

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

      将来会有新的未知字段,每次有新字段时,将它们添加到 Avro 架构中。所以基本上我们是手动完成 SparkSQL 的工作。

    【讨论】:

    • 令人惊讶的是,我正在处理非常相似的问题。你知道你的第二个选择的任何例子吗?我只使用过 Spark,没有编写过 Hadoop MapReduce 作业。
    • 其实我在生产中使用的是第二种方式,我的schema有超过3000个字段,这个schema是由MapReduce程序推断出来的,每次有新字段时,我都需要生成再次架构。
    • 太好了!很高兴你发现它可行。如果您想分享任何提示或技巧,我还发布了另一个相关问题。 stackoverflow.com/questions/35495041/…
    【解决方案2】:

    使用 Apache Drill!

    来自https://drill.apache.org/docs/parquet-format/,在 1 行 SQL 中。

    设置好 Apache Drill(带或不带 HDFS)后,执行 sqline.sh 运行 SQL 查询:

    // Set default format ALTER SESSION SET `store.format` = 'parquet'; 
    ALTER SYSTEM SET `store.format` = 'parquet';
    
    // Migrate data
    CREATE TABLE dfs.tmp.sampleparquet AS  (SELECT trans_id,  cast(`date` AS date) transdate,  cast(`time` AS time) transtime,  cast(amount AS double) amountm, user_info, marketing_info, trans_info  FROM dfs.`/Users/drilluser/sample.json`);
    

    应该需要一些时间,也许是几个小时,但最后,您将拥有轻巧酷炫的镶木地板文件 ;-)

    在我的测试中,查询 parquet 文件比 JSON 快 4 倍,并且要求的资源更少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-08
      • 2018-11-21
      • 2018-12-15
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多