Azure Data Lake 的 Spark 谓词下推、过滤和分区修剪

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

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

假设我有一个包含列的数据集 (年:整数,学校名称:字符串,学号:整数,科目注册:字符串) 其中存储在磁盘上的数据按年份和学校名称分区,并以镶木地板格式存储在 Azure 数据湖存储中。

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

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

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 将扫描该镶木地板 table 的每个文件夹中的每个 part 文件。只有当你有下推过滤时,Spark 才会使用每个 part 文件的页脚(存储最小值、最大值和计数统计信息的位置)来确定你的搜索值是否在该范围内。如果是,Spark 将完整读取文件。如果没有,Spark 将跳过整个文件,至少不会花费您完整的阅读时间。