簡體   English   中英

用於 Azure 數據湖的 Spark 謂詞下推、過濾和分區修剪

[英]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"):

  • 分區修剪是否會生效,並且只會讀取有限數量的分區?
  • 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 將掃描該 parquet 表的每個文件夾中的每個part文件。 只有當您進行下推過濾時,Spark 才會使用每個part文件的頁腳(存儲 min、max 和 count 統計信息的位置)來確定您的搜索值是否在該范圍內。 如果是,Spark 將完全讀取文件。 如果沒有,Spark 將跳過整個文件,至少不會花費您完整的閱讀時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM