使用filter和basepath+full filter path读取spark数据集有区别吗?

0yg35tkg  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(507)

对于按某列划分的数据集的读取效率,以下两者之间是否有区别:

// (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)所做的。

lb3vh1jj

lb3vh1jj1#

有很大的不同。
在第一种情况下,您将读取所有文件,然后过滤,在第二种情况下,您将只读取选定的文件(过滤是由分区完成的)。
您可以使用 explain() 功能。在你的 FileScan parquet 你会看到的 PushedFilters 以及 PartitionFilters 在您的情况下,应该读取不带过滤器的分区数据。

spark.read.option("basePath", "/root/path").parquet("/root/path/mycolumn=42")

相关问题