我一直在阅读有关Spark谓词下推和分区修剪的信息,以了解读取的数据量。我对此有以下疑问
假设我有一个包含列的数据集 (年份:国际,学校名称:字符串,学生编号:国际,已注册学科:字符串) 其中存储在磁盘上的数据按Year和SchoolName进行分区,并以拼花格式存储在例如Azure Data Lake存储器中。
1)如果我发出read spark.read(container).filter(Year = 2019,SchoolName =“ XYZ”):
2)如果我发出读取spark.read(container).filter(StudentId = 43):
答案 0 :(得分:0)
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将扫描该镶木文件的每个文件夹部分中的每个文件。仅当您具有下推式过滤功能时,Spark才会使用零件文件的页脚(存储最小值和最大值统计信息)来确定您的搜索值是否在该范围内。如果是,Spark将完全读取该文件。如果不是,Spark将跳过整个文件,而不会花费您至少完整的读取时间。