【问题标题】:What is the benefit of using nested data types in Parquet?在 Parquet 中使用嵌套数据类型有什么好处?
【发布时间】:2019-10-06 23:57:28
【问题描述】:

在 Parquet 文件格式中使用嵌套数据类型是否会带来任何性能优势?

AFAIK Parquet 文件通常是专门为查询服务创建的,例如Athena,因此创建这些值的过程还不如简单地展平值 - 从而允许更轻松的查询、更简单的架构并保留每列的列统计信息。

使用嵌套数据类型可以获得什么好处,例如struct?

【问题讨论】:

    标签: apache-spark nested parquet data-files


    【解决方案1】:

    在镶木地板中保留嵌套结构会产生负面影响。如果 parquet 文件中有嵌套结构,问题是 spark 谓词下推无法正常工作。

    因此,即使您使用 parquet 数据集中的少数字段,spark 也会加载并具体化整个数据集。

    这里是ticket关于这个问题打开了很长时间。

    编辑

    此问题已在 spark 2.4 版本中得到解决。

    【讨论】:

    • 嵌套数据模式是否也不允许谓词下推,即每个嵌套值的“列统计信息”?我相信我在查看镶木地板文件时看到了这样的值。 (或者您的意思是 Spark 专门无法处理此元数据?)。你是说完全扁平化数据更好吗?我认为 Parquet 的全部目的是对嵌套数据的原生支持。
    • 是的,最好将数据展平。我也遇到了同样的问题,我保持数据嵌套并且在数据帧上的查询变平后变得非常快。这是另一个issues.apache.org/jira/browse/SPARK-4502 Ticket,他们正试图解决这个问题
    • 已在 2.4.0 版本中修复,请更新答案。
    【解决方案2】:

    恰恰相反 - Parquet 是一种列格式,但是从 Spark 2.3.0 开始,Spark 没有正确使用它(请参阅https://issues.apache.org/jira/browse/SPARK-4502),并且使用结构/嵌套格式意味着将读取整个列,您可以'仅从读取所需数据中受益

    @avishek 的答案请注意,谓词下推意味着 spark(或任何利用 parquet 特性的引擎)将读取整个数据集,这意味着引擎可以使用有关列的元数据(如 min man 值)来确定如果应该读取一个卡盘,如果需要读取一个块,parquet 将允许仅读取请求的列

    已编辑:将信息从评论移至主要答案

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2015-08-01
    • 2011-05-16
    • 2018-10-11
    • 2019-07-05
    • 2023-03-18
    • 2023-04-06
    • 2017-07-28
    相关资源
    最近更新 更多