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"):
- Partition Pruning会不会生效,只读取有限数量的分区?
- 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 将扫描该镶木地板 table 的每个文件夹中的每个 part
文件。只有当你有下推过滤时,Spark 才会使用每个 part
文件的页脚(存储最小值、最大值和计数统计信息的位置)来确定你的搜索值是否在该范围内。如果是,Spark 将完整读取文件。如果没有,Spark 将跳过整个文件,至少不会花费您完整的阅读时间。
我一直在阅读有关 spark 谓词下推和分区修剪的内容,以了解读取的数据量。我有以下与此相关的疑问
假设我有一个包含列的数据集 (年:整数,学校名称:字符串,学号:整数,科目注册:字符串) 其中存储在磁盘上的数据按年份和学校名称分区,并以镶木地板格式存储在 Azure 数据湖存储中。
1) 如果我发出读取 spark.read(container).filter(Year=2019, SchoolName="XYZ"):
- Partition Pruning会不会生效,只读取有限数量的分区?
- 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 将扫描该镶木地板 table 的每个文件夹中的每个 part
文件。只有当你有下推过滤时,Spark 才会使用每个 part
文件的页脚(存储最小值、最大值和计数统计信息的位置)来确定你的搜索值是否在该范围内。如果是,Spark 将完整读取文件。如果没有,Spark 将跳过整个文件,至少不会花费您完整的阅读时间。