适用于Azure Data Lake的Spark谓词下推,筛选和分区修剪

时间:2019-09-27 19:49:42

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

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

假设我有一个包含列的数据集 (年份:国际,学校名称:字符串,学生编号:国际,已注册学科:字符串) 其中存储在磁盘上的数据按Year和SchoolName进行分区,并以拼花格式存储在例如Azure Data Lake存储器中。

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

  • 分区修剪将生效并且仅读取有限数量的分区吗?
  • blob存储上是否会有I / O,数据将被加载到Spark集群然后进行过滤,即我是否需要为不需要的所有其他数据的IO支付Azure费用?
  • 如果不是默认情况下,azure blob文件系统无法查询,那么怎么办?

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

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

1 个答案:

答案 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将跳过整个文件,而不会花费您至少完整的读取时间。