对于按某列划分的数据集的读取效率,以下两者之间是否有区别:
// (1) read all dataset then filter
spark.read.parquet("/root/path").filter(col("mycolumn") === 42)
和
// (2) read directly the required data subset
spark.read.option("basePath", "/root/path").parquet("/root/path/mycolumn=42")
?
我在这样一个上下文中问这个问题:数据文件与spark不存储在同一个集群中(因此,没有数据局部性)。我特别想知道,在案例(1)中,它是否会检索spark集群上的完整数据集文件,然后对其进行过滤(希望没有实际读取文件),或者是否会在检索文件之前进行过滤,这正是我期望案例(2)所做的。
1条答案
按热度按时间lb3vh1jj1#
有很大的不同。
在第一种情况下,您将读取所有文件,然后过滤,在第二种情况下,您将只读取选定的文件(过滤是由分区完成的)。
您可以使用
explain()
功能。在你的FileScan parquet
你会看到的PushedFilters
以及PartitionFilters
在您的情况下,应该读取不带过滤器的分区数据。