模型半結構化數據
本文會根據貴組織如何使用數據,建議儲存半結構化數據的模式。 Azure Databricks 提供函式、原生數據類型和查詢語法,以使用半結構化、巢狀和複雜的數據。
下列考慮會影響您應該使用的模式:
- 數據源中的欄位或類型是否經常變更?
- 數據源中包含多少個唯一欄位?
- 您需要優化工作負載以進行寫入或讀取嗎?
Databricks 建議將數據儲存為下游查詢的 Delta 數據表。
使用 variant
在 Databricks Runtime 15.3 和更新版本中,您可以使用 VARIANT
類型來儲存半結構化 JSON 數據,其編碼優於 JSON 字串以進行讀取和寫入。
此 VARIANT
類型具有類似 JSON 字串的應用程式。 某些工作負載仍受益於使用結構、地圖和陣列,尤其是具有已知架構的數據,這些架構可受益於優化的數據配置和統計數據集合。
如需詳細資訊,請參閱下列文章:
使用 JSON 字串
您可以使用標準 JSON 格式將資料儲存在單一字串數據行中,然後使用 :
表示法查詢 JSON 中的欄位。
許多系統會將記錄輸出為字串或位元組編碼的 JSON 記錄。 將這些記錄擷取和儲存為字串的處理負荷非常低。 您也可以使用 函 to_json
式,將任何數據結構轉換成 JSON 字串。
選擇資料儲存為 JSON 字串時,請考慮下列優點和弱點:
- 所有值都會儲存為不含類型資訊的字串。
- JSON 支援可使用文字表示的所有數據類型。
- JSON 支援任意長度的字串。
- 單一 JSON 資料行中可以表示的欄位數目沒有任何限制。
- 寫入數據表之前,數據不需要預先處理。
- 您可以解決下游工作負載中數據中的類型問題。
- JSON 提供讀取時最差的效能,因為您必須剖析每個查詢的整個字串。
JSON 字串提供絕佳的彈性和易於實作的解決方案,可將原始數據放入 Lakehouse 數據表。 您可以選擇對許多應用程式使用 JSON 字串,但是當工作負載最重要的結果儲存數據源的完整且精確的表示法以供下游處理時,它們特別有用。 某些使用案例可能包括:
- 從 Kafka 等佇列服務擷取串流數據。
- 錄製回應 REST API 查詢。
- 從您的小組未控制的上游數據源儲存原始記錄。
假設您的擷取邏輯具有彈性,即使遇到新的欄位、數據結構中的變更,或數據源中的類型變更,將數據儲存為 JSON 字串也應該具有復原性。 雖然下游工作負載可能會因為這些變更而失敗,但您的數據表包含源數據的完整歷程記錄,這表示您可以補救問題,而不需要返回數據源。
使用結構
您可以使用結構來儲存半結構化數據,並啟用數據行的所有原生功能,同時維護數據源的巢狀結構。
Delta Lake 會將儲存的數據視為結構,與其他任何數據行相同,這表示結構與數據行沒有功能差異。 Delta Lake 所使用的 Parquet 資料檔會為結構中的每個字段建立一個數據行。 您可以使用結構欄位作為叢集資料欄或分割資料欄,並且您可以針對結構收集統計數據,以達到略過數據的效果。
結構通常會在讀取時提供最佳效能,因為它們支援所有略過優化的數據,並將個別欄位儲存為數據行。 當存在的數據行數目進入數百個時,效能可能會開始受到影響。
結構中的每個欄位都有資料類型,這會在寫入時如同欄位一樣被強制執行。 因此,結構需要完整預先處理數據。 當您只希望只有已驗證的數據提交到資料表中時,這是有利的,但處理上游系統中格式不當的記錄時,可能會導致數據遺失或作業失敗。
結構體相較於 JSON 數據流,在架構演進方面的彈性較低,無論是演進數據類型還是新增欄位。
使用地圖和陣列
您可以使用地圖和數位的組合,以原生方式在 Delta Lake 中復寫半結構化數據格式。 無法收集這些類型所定義之欄位的統計數據,但是針對大約 500 個字段的半結構化數據集,提供平衡的讀取和寫入效能。
映射的鍵和值類型是已定義的,因此,資料會被預先處理,並在寫入時套用架構。
為了加速查詢,Databricks 建議將經常用來篩選數據的欄位儲存為單獨的列。
我需要扁平化數據嗎?
如果您使用 JSON 或地圖來儲存資料,請考慮將經常用於查詢篩選的欄位儲存為欄位。 JSON 字串或對應內的欄位無法使用 Stats 集合、資料分割和叢集。 您不需要針對儲存為結構的數據執行此動作。
使用巢狀數據的語法
如需使用巢狀數據的相關信息,請檢閱下列資源: