繁体   English   中英

用于 Azure 数据湖的 Spark 谓词下推、过滤和分区修剪

[英]Spark Predicate Push Down, Filtering and Partition Pruning for Azure Data Lake

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

假设我有一个包含列(Year: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 的费用?

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文件的页脚(存储 min、max 和 count 统计信息的位置)来确定您的搜索值是否在该范围内。 如果是,Spark 将完全读取文件。 如果没有,Spark 将跳过整个文件,至少不会花费您完整的阅读时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM