Apache Iceberg 底層數據查詢原理解析
Apache Iceberg 底層數據存儲
Iceberg 數據組織圖(HDFS): 5個SnapShot對應5個manifest list清單列表。
1.查詢最新快照數據
獲取最新元數據
獲取 Iceberg 表的最新元數據文件,eg:00000-ec504.metadata.json
。
解析元數據
從元數據文件中提取以下信息:
- 當前表的快照 ID:
949358624197301886
- 所有快照信息:在 JSON 中的
snapshots
數組。
獲取快照文件信息
根據快照 ID,找到對應的 Avro 文件信息,eg:snap--32800.avro
。
在該快照文件中,提取 Manifest File清單文件信息:
*32800-m0.avro
*2abba-m0.avro
*d33de-m0.avro
*748bf-m0.avro
*b946e-m0.avro
讀取最新數據
讀取以上 Manifest File清單文件中描述的 Parquet 數據文件(Data files)。
分析 Snap 文件
在 snap--32800.avro
文件中,可以找到以下屬性:
deleted data files count
added data files count
existing data files count
判斷數據文件狀態(tài)
Iceberg 根據 deleted data files count
判斷是否存在被刪除的數據:
如果該值大于 0,表示對應的 Manifest 文件中有已刪除的數據。讀取數據時,無需讀取這些被刪除的文件。
Manifest 清單文件分析
根據 Manifest 清單文件,找到對應的 Parquet 文件存儲位置。
每個 Manifest 文件中有 status
屬性:
1
:代表對應的 Parquet 文件為新增文件,需要讀取。
2
:代表 Parquet 文件被刪除。
2.查詢指定快照(歷史快照)數據
Apache Iceberg 支持查詢歷史上任何時刻的快照。
要查詢特定快照,需要指定 snapshot-id
屬性,可以通過 Spark 或 Flink 實現。
在 Spark 中查詢指定快照的數據:
spark.read .option("snapshot-id", 6155488348798912701L) .format("iceberg") .load("path")
查詢某個快照數據的原理:
指定快照 ID
在讀取數據時,通過 snapshot-id
指定要查詢的快照。
查找快照信息
Iceberg 會根據指定的快照 ID 檢索相關的元數據(如下metadata里面的snapshots數組),包括快照中包含的數據文件和 Manifest 文件。
3.根據時間戳查詢某個快照數據
Apache Iceberg 支持通過 as-of-timestamp
參數讀取特定時間戳的快照數據,通常也是通過 Spark 或 Flink 實現。
在 Spark 中根據時間戳查詢數據:
spark.read .option("as-of-timestamp", "時間戳") .format("iceberg") .load("path")
指定時間戳
使用 as-of-timestamp
指定要查詢的時間點。
查找快照信息
Iceberg 將查找與時間戳對應的快照,利用 *.metadata.json
文件中的信息。
屬性解析
在元數據文件中,除了 current-snapshot-id
和 snapshots
屬性外,還有一個 snapshot-log
屬性,該屬性記錄了快照的歷史信息。
到此這篇關于Apache Iceberg - 底層數據查詢原理的文章就介紹到這了,更多相關Apache Iceberg原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Linux LVM邏輯卷配置過程(創(chuàng)建,增加,減少,刪除,卸載)
這篇文章主要介紹了詳解Linux LVM邏輯卷配置過程(創(chuàng)建,增加,減少,刪除,卸載),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08