您好,登錄后才能下訂單哦!
如何分析delta lake表schema演進,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
下面主要是深入探究一下delta lake的schema演變。
數據,就像我們的經驗一樣,總是在不斷發展和積累。為了跟上時代的步伐,我們的思維模式必須適應新數據,其中一些包含新的維度-一種新的方式來查看我們以前從未想到的事物。這些思維模式與表的schema沒有什么不同,它們定義了我們如何對新信息進行分類和處理。
隨著業務問題和需求的發展,數據的結構也將隨之變化。使用Delta Lake,隨著數據的變化,合并新維度變得容易。用戶可以使用簡單的語義來控制其表的schema。這些工具包括schema校驗(可防止用戶因錯誤或垃圾數據而無意中污染其表)以及schema演進(也就是為了豐富數據而增加一些新的列)。
Apache Spark?中的每個DataFrame都包含一個schema,定義了數據的格式,例如數據類型和列以及元數據。使用Delta Lake,表的schema以JSON格式保存在事務日志中。
schema校驗是Delta Lake中的一種安全措施,它通過拒絕對表的schema不匹配的寫入來確保數據質量。就像忙碌的餐廳的前臺經理只接受預訂一樣,它會檢查插入表中的數據中的每一列是否在其預期列的列表中(換句話說,每一列是否都有“預訂”),以及拒絕所有不在列表中的列的寫操作。
Delta Lake 在write操作上使用schema驗證,這意味著在寫入時會檢查對表的所有新寫入是否與目標表的schema兼容。如果schema不兼容,則Delta Lake將完全取消事務(不寫入任何數據),并引發異常以使用戶知道不匹配的情況。
為了確定對表的寫入是否兼容,Delta Lake使用以下規則。要寫入的DataFrame:
不能包含目標表的架構中不存在的任何其他列。相反輸入的數據不包含表中的某些列是可以的,這些列將被簡單地分配為空值。
列的數據類型不能與目標表中的列數據類型不同。如果目標表的列包含StringType數據,但DataFrame中的相應列包含IntegerType數據,則schema強制實施將引發異常并阻止進行寫操作。
不能包含僅大小寫不同的列名。這意味著不能在同一表中定義諸如“ Foo”和“ foo”之類的列。盡管Spark可用于區分大小寫或不區分大小寫(默認)模式,但是Delta Lake保留大小寫,卻在存儲schema時不區分大小寫。存儲和返回列信息時,Parquet區分大小寫。為了避免潛在的錯誤,數據損壞或丟失問題,才添加此限制。
為了說明,請看下面的代碼,當試圖將一些新計算的列追加到不兼容它們的delta lake表的時候,將發生什么。
# Generate a DataFrame of loans that we'll append to our Delta Lake table
loans = sql("""
SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
CAST(rand(10) * 10000 * count AS double) AS amount
FROM loan_by_state_delta
""")
# Show original DataFrame's schema
original_loans.printSchema()
"""
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
"""
# Show new DataFrame's schema
loans.printSchema()
"""
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
|-- amount: double (nullable = true) # new column
"""
# Attempt to append new DataFrame (with new column) to existing table
loans.write.format("delta") \
.mode("append") \
.save(DELTALAKE_PATH)
""" Returns:
A schema mismatch detected when writing to the Delta table.
To enable schema migration, please set:
'.option("mergeSchema", "true")\'
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.
"""
Delta Lake不會自動添加新列,而是強制校驗schema并阻止寫入。為了幫助確定導致不匹配的列,Spark在堆棧跟蹤中打印出了兩種schema以進行比較。
由于這種檢查非常嚴格,所以數據可以直接用于生產環境。常見的使用場景如下:
機器學習算法
BI儀表板
數據分析和可視化工具
任何需要高度結構化,強類型語義schema的生產系統
防止數據稀疏
強制性的schema校驗,可能會導致大家在編寫spark任務的時候拘束比較多,一遇到schema不兼容任務就會崩潰,這個可能是會令人頭疼。
但是假設不對schema進行校驗,那么隨時可能新增列,導致表變的越來越稀疏。其實,這也是一種性能消耗。
所以,schema校驗也有防止數據變的越來越稀疏的作用。
schema演變簡單來數就是表的schema會隨著數據的變化而變化。最常見的是,在執行附加或覆蓋操作時使用它來自動調整schema以包括一個或多個新列。
配置很簡單,通過添加 .option('mergeSchema', 'true')到您的.write或.writeStreamSpark命令來啟動schema演變 。
# Add the mergeSchema optionloans.write.format("delta") \ .option("mergeSchema", "true") \ .mode("append") \ .save(DELTALAKE_SILVER_PATH)
執行下面的sql表達式:
# Create a plot with the new column to confirm the write was successful%sqlSELECT addr_state, sum(`amount`) AS amountFROM loan_by_state_deltaGROUP BY addr_stateORDER BY sum(`amount`)DESC LIMIT 10
可以繪制一張統計圖:
通過mergeSchema設置為true,DataFrame中存在但目標表中不存在的所有列將作為寫事務的一部分自動添加到schema的末尾。還可以添加嵌套字段,并且這些字段也將添加到其各自的struct列的末尾。
數據工程師和科學家可以使用此選項在其現有的機器學習生產表中添加新列(也許是新跟蹤的指標,或本月銷售數字的列),而不會破壞依賴舊列的現有模型。
在表追加或覆蓋期間,以下類型的模式更改可用于schema演變:
添加新列(這是最常見的情況)
從NullType->任何其他類型更改數據類型,或從ByteType-> ShortType-> IntegerType更改數據
其他不適合架構演變的更改要求通過添加.option("overwriteSchema", "true")來覆蓋schema和數據。例如,在“ Foo”列最初是integer數據類型,而新模式將是字符串數據類型的情況下,則需要重寫所有Parquet(數據)文件。這些更改包括:
刪除列
更改現有列的數據類型
重命名僅因大小寫而異的列名(例如“ Foo”和“ foo”)
最后,在Spark 3.0中,ALTER TABLE將完全支持顯式DDL,從而允許用戶對表schema執行以下操作:
添加列
更改列注釋
設置定義表行為的表屬性,例如設置事務日志的保留期限
在打算更改表的schema時可以使用模式演變。這是遷移架構的最簡單方法,因為它會自動添加正確的列名稱和數據類型,而無需顯式聲明它們。
模式校驗會拒絕與表不兼容的任何新列或其他模式更改。通過制定和遵守這些高標準,分析人員和工程師可以相信他們的數據具有最高的完整性,并且可以清晰地進行推理,從而使他們能夠做出更好的業務決策。
在另一方面,schema演變通過使schema自動發生更改變得容易,從而補充了schema的強制校驗。畢竟,添加一列并不難。
schema校驗是架構演進的核心。當一起使用時,這些功能比以往任何時候都更容易阻止噪聲的產生。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。