[英]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"):
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 將掃描該 parquet 表的每個文件夾中的每個part
文件。 只有當您進行下推過濾時,Spark 才會使用每個part
文件的頁腳(存儲 min、max 和 count 統計信息的位置)來確定您的搜索值是否在該范圍內。 如果是,Spark 將完全讀取文件。 如果沒有,Spark 將跳過整個文件,至少不會花費您完整的閱讀時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.