gpt4 book ai didi

apache-spark-sql - 为什么 Spark SQL 中嵌套列的查询性能不同?

转载 作者:行者123 更新时间:2023-12-03 17:39:33 26 4
gpt4 key购买 nike

我使用 Spark SQL 以 Parquet 格式编写了一些数据,其中生成的架构如下所示:

root
|-- stateLevel: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)
|-- countryLevel: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)
|-- global: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)

我还可以将相同的数据转换为更扁平的架构,如下所示:
root
|-- stateLevelCount1: integer (nullable = false)
|-- stateLevelCount2: integer (nullable = false)
|-- stateLevelCount3: integer (nullable = false)
|-- stateLevelCount4: integer (nullable = false)
|-- stateLevelCount5: integer (nullable = false)
|-- countryLevelCount1: integer (nullable = false)
|-- countryLevelCount2: integer (nullable = false)
|-- countryLevelCount3: integer (nullable = false)
|-- countryLevelCount4: integer (nullable = false)
|-- countryLevelCount5: integer (nullable = false)
|-- globalCount1: integer (nullable = false)
|-- globalCount2: integer (nullable = false)
|-- globalCount3: integer (nullable = false)
|-- globalCount4: integer (nullable = false)
|-- globalCount5: integer (nullable = false)

现在,当我对像 global.count1 这样的列上的第一个数据集运行查询时,它比在第二个数据集中查询 globalCount1 花费的时间要长得多。相反,将第一个数据集写入 Parquet 所需的时间比写入第二个数据集要短得多。我知道由于 Parquet,我的数据以柱状方式存储,但我认为所有嵌套列都将单独存储在一起。例如,在第一个数据集中,似乎整个“全局”列被存储在一起,而不是“global.count1”、“global.count2”等值被存储在一起。这是预期的行为吗?

最佳答案

有趣的。 “它比查询需要更长的时间..”你能分享多长时间吗?谢谢。

看代码https://github.com/Parquet/parquet-mr/blob/master/parquet-column/src/main/java/parquet/io/RecordReaderImplementation.java#L248似乎从结构中读取可能会有一些开销。虽然只是查看 Parquet 代码,但它不应该“更长”。

我认为更大的问题是 Spark 如何在这种情况下下推谓词。例如,在这种情况下它可能无法使用布隆过滤器。您能否分享您在两种情况下和时间上查询数据的方式。哪些版本的 Spark、Parquet、Hadoop 等?

Parquet-1.5 有问题 https://issues.apache.org/jira/browse/PARQUET-61在某些情况下,这可能会导致 4-5 倍的减速。

关于apache-spark-sql - 为什么 Spark SQL 中嵌套列的查询性能不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39622787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com