【问题标题】:Spark Predicate Push Down, Filtering and Partition Pruning for Azure Data LakeAzure Data Lake 的 Spark 谓词下推、过滤和分区修剪
【发布时间】:2020-01-28 03:18:49
【问题描述】:

我一直在阅读有关 spark 谓词下推和分区修剪的文章,以了解读取的数据量。我有以下与此相关的疑问

假设我有一个包含列的数据集 (年份:Int,SchoolName:String,StudentId:Int,SubjectEnrolled:String) 其中存储在磁盘上的数据按 Year 和 SchoolName 分区,并以 parquet 格式存储在 Azure 数据湖存储中。

1) 如果我发出读取 spark.read(container).filter(Year=2019, SchoolName="XYZ"):

  • 分区修剪是否会生效并且只会读取有限数量的分区?
  • Blob 存储是否存在 I/O,并且数据将加载到 Spark 集群然后进行过滤,即我是否必须为我们不需要的所有其他数据的 IO 支付 azure 费用?
  • 如果不是默认情况下不可查询,azure blob 文件系统如何理解这些过滤器?

2) 如果我发出读取 spark.read(container).filter(StudentId = 43) :

  • spark 是否仍会将过滤器推送到磁盘并仅读取所需的数据?由于我没有按此分区,它会理解每一行并根据查询进行过滤吗?
  • 对于根据查询不需要的所有文件,我是否需要再次支付 IO 到 Azure 的费用?

【问题讨论】:

标签: azure apache-spark apache-spark-sql azure-data-lake apache-spark-dataset


【解决方案1】:

1) 当您在分区的列上使用过滤器时,Spark 将完全跳过这些文件,并且不会花费您任何 IO。如果您查看您的文件结构,它的存储格式如下:

parquet-folder/Year=2019/SchoolName=XYZ/part1.parquet
parquet-folder/Year=2019/SchoolName=XYZ/part2.parquet
parquet-folder/Year=2019/SchoolName=XYZ/...

2) 当您过滤某个不在分区中的列时,Spark 将扫描该 parquet 表的每个文件夹中的每个 part 文件。只有当您进行下推过滤时,Spark 才会使用每个part 文件的页脚(存储最小值、最大值和计数统计信息的位置)来确定您的搜索值是否在该范围内。如果是,Spark 将完全读取文件。如果没有,Spark 将跳过整个文件,至少不会花费您完整的阅读时间。

【讨论】:

  • HDFS 确实如此。但是,正如 OP 在他最初的问题中所问的那样,这是否也适用于 Azure Data Lake Store?请问predicated by会一直推到ADLS,而ADLS只会返回相关数据吗?还是把所有的数据都传进去,导致IO成本?
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2019-01-21
  • 2016-07-14
  • 2019-07-04
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多