gpt4 book ai didi

apache-spark - 在 PySpark 中读取文件在读取整个目录然后过滤和读取目录的一部分之间有什么区别?

转载 作者:行者123 更新时间:2023-12-05 06:01:54 27 4
gpt4 key购买 nike

假设我有一个每天运行的数据模型,样本 HDFS 路径是

data_model/sales_summary/grass_date=2021-04-01

如果我想读完2月和3月的所有模型,按以下两种方式读有什么区别:

答:

spark.read.parquet('data_model/sales_summary/grass_date=2021-0{2,3}*')

乙:

spark.read.parquet('data_model/sales_summary/').filter(col('grass_date').between('2021-02-01', '2021-03-30'))

这两种阅读方式是等价的吗?如果不是,在什么情况下哪个效率更高?

最佳答案

Spark在读取文件的时候会做分区过滤,所以这两种方式的性能应该差不多。下面的查询计划显示了如何在文件扫描操作中使用分区过滤器。

spark.read.parquet('data_model/sales_summary/grass_date=2021-0{2,3}*').explain()
== Physical Plan ==
*(1) ColumnarToRow
+- FileScan parquet [id#18] Batched: true, DataFilters: [], Format: Parquet, Location: InMemoryFileIndex[file:/tmp/data_model/sales_summary/grass_date=2021-02-21, file:/tmp/data_model/..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<id:int>

spark.read.parquet('data_model/sales_summary/').filter(F.col('grass_date').between('2021-02-01', '2021-03-30')).explain()
== Physical Plan ==
*(1) ColumnarToRow
+- FileScan parquet [id#24,grass_date#25] Batched: true, DataFilters: [], Format: Parquet, Location: InMemoryFileIndex[file:/tmp/data_model/sales_summary], PartitionFilters: [isnotnull(grass_date#25), (grass_date#25 >= 18659), (grass_date#25 <= 18716)], PushedFilters: [], ReadSchema: struct<id:int>

但请注意,如果您使用第一种方法读取文件,数据框中将缺少分区列,因此您可能更喜欢第二种方法。

关于apache-spark - 在 PySpark 中读取文件在读取整个目录然后过滤和读取目录的一部分之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67089439/

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