在pyspark中读取文件的区别是读取整个目录,然后过滤和读取目录的一部分?

ego6inou  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(327)

假设我有一个每天运行的数据模型,示例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'))

这两种阅读方法相等吗?如果没有,在什么情况下哪一个更有效?

gojuced7

gojuced71#

spark在读取文件时会进行分区过滤,因此这两种方法的性能应该是相似的。下面的查询计划显示如何在filescan操作中使用分区过滤器。

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>

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

cu6pst1q

cu6pst1q2#

我们应该用第一个(a)是对的。
a-我们正在选择特定的文件夹(我们只读取所需的数据)。
b-我们读取所有数据,然后应用过滤器(在这里,我们读取所有数据,这是昂贵的)。

相关问题