如何分析delta lake表schema演進,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創(chuàng)新互聯(lián)主營鐵東網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都App定制開發(fā),鐵東h5微信平臺小程序開發(fā)搭建,鐵東網(wǎng)站營銷推廣歡迎鐵東等地區(qū)企業(yè)咨詢
下面主要是深入探究一下delta lake的schema演變。
數(shù)據(jù),就像我們的經(jīng)驗一樣,總是在不斷發(fā)展和積累。為了跟上時代的步伐,我們的思維模式必須適應新數(shù)據(jù),其中一些包含新的維度-一種新的方式來查看我們以前從未想到的事物。這些思維模式與表的schema沒有什么不同,它們定義了我們?nèi)绾螌π滦畔⑦M行分類和處理。
隨著業(yè)務問題和需求的發(fā)展,數(shù)據(jù)的結構也將隨之變化。使用Delta Lake,隨著數(shù)據(jù)的變化,合并新維度變得容易。用戶可以使用簡單的語義來控制其表的schema。這些工具包括schema校驗(可防止用戶因錯誤或垃圾數(shù)據(jù)而無意中污染其表)以及schema演進(也就是為了豐富數(shù)據(jù)而增加一些新的列)。
Apache Spark?中的每個DataFrame都包含一個schema,定義了數(shù)據(jù)的格式,例如數(shù)據(jù)類型和列以及元數(shù)據(jù)。使用Delta Lake,表的schema以JSON格式保存在事務日志中。
schema校驗是Delta Lake中的一種安全措施,它通過拒絕對表的schema不匹配的寫入來確保數(shù)據(jù)質(zhì)量。就像忙碌的餐廳的前臺經(jīng)理只接受預訂一樣,它會檢查插入表中的數(shù)據(jù)中的每一列是否在其預期列的列表中(換句話說,每一列是否都有“預訂”),以及拒絕所有不在列表中的列的寫操作。
Delta Lake 在write操作上使用schema驗證,這意味著在寫入時會檢查對表的所有新寫入是否與目標表的schema兼容。如果schema不兼容,則Delta Lake將完全取消事務(不寫入任何數(shù)據(jù)),并引發(fā)異常以使用戶知道不匹配的情況。
為了確定對表的寫入是否兼容,Delta Lake使用以下規(guī)則。要寫入的DataFrame:
不能包含目標表的架構中不存在的任何其他列。相反輸入的數(shù)據(jù)不包含表中的某些列是可以的,這些列將被簡單地分配為空值。
列的數(shù)據(jù)類型不能與目標表中的列數(shù)據(jù)類型不同。如果目標表的列包含StringType數(shù)據(jù),但DataFrame中的相應列包含IntegerType數(shù)據(jù),則schema強制實施將引發(fā)異常并阻止進行寫操作。
不能包含僅大小寫不同的列名。這意味著不能在同一表中定義諸如“ Foo”和“ foo”之類的列。盡管Spark可用于區(qū)分大小寫或不區(qū)分大小寫(默認)模式,但是Delta Lake保留大小寫,卻在存儲schema時不區(qū)分大小寫。存儲和返回列信息時,Parquet區(qū)分大小寫。為了避免潛在的錯誤,數(shù)據(jù)損壞或丟失問題,才添加此限制。
為了說明,請看下面的代碼,當試圖將一些新計算的列追加到不兼容它們的delta lake表的時候,將發(fā)生什么。
# 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以進行比較。
由于這種檢查非常嚴格,所以數(shù)據(jù)可以直接用于生產(chǎn)環(huán)境。常見的使用場景如下:
機器學習算法
BI儀表板
數(shù)據(jù)分析和可視化工具
任何需要高度結構化,強類型語義schema的生產(chǎn)系統(tǒng)
防止數(shù)據(jù)稀疏
強制性的schema校驗,可能會導致大家在編寫spark任務的時候拘束比較多,一遇到schema不兼容任務就會崩潰,這個可能是會令人頭疼。
但是假設不對schema進行校驗,那么隨時可能新增列,導致表變的越來越稀疏。其實,這也是一種性能消耗。
所以,schema校驗也有防止數(shù)據(jù)變的越來越稀疏的作用。
schema演變簡單來數(shù)就是表的schema會隨著數(shù)據(jù)的變化而變化。最常見的是,在執(zhí)行附加或覆蓋操作時使用它來自動調(diào)整schema以包括一個或多個新列。
配置很簡單,通過添加 .option('mergeSchema', 'true')到您的.write或.writeStreamSpark命令來啟動schema演變 。
# Add the mergeSchema optionloans.write.format("delta") \ .option("mergeSchema", "true") \ .mode("append") \ .save(DELTALAKE_SILVER_PATH)
執(zhí)行下面的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
可以繪制一張統(tǒng)計圖:
通過mergeSchema設置為true,DataFrame中存在但目標表中不存在的所有列將作為寫事務的一部分自動添加到schema的末尾。還可以添加嵌套字段,并且這些字段也將添加到其各自的struct列的末尾。
數(shù)據(jù)工程師和科學家可以使用此選項在其現(xiàn)有的機器學習生產(chǎn)表中添加新列(也許是新跟蹤的指標,或本月銷售數(shù)字的列),而不會破壞依賴舊列的現(xiàn)有模型。
在表追加或覆蓋期間,以下類型的模式更改可用于schema演變:
添加新列(這是最常見的情況)
從NullType->任何其他類型更改數(shù)據(jù)類型,或從ByteType-> ShortType-> IntegerType更改數(shù)據(jù)
其他不適合架構演變的更改要求通過添加.option("overwriteSchema", "true")來覆蓋schema和數(shù)據(jù)。例如,在“ Foo”列最初是integer數(shù)據(jù)類型,而新模式將是字符串數(shù)據(jù)類型的情況下,則需要重寫所有Parquet(數(shù)據(jù))文件。這些更改包括:
刪除列
更改現(xiàn)有列的數(shù)據(jù)類型
重命名僅因大小寫而異的列名(例如“ Foo”和“ foo”)
最后,在Spark 3.0中,ALTER TABLE將完全支持顯式DDL,從而允許用戶對表schema執(zhí)行以下操作:
添加列
更改列注釋
設置定義表行為的表屬性,例如設置事務日志的保留期限
在打算更改表的schema時可以使用模式演變。這是遷移架構的最簡單方法,因為它會自動添加正確的列名稱和數(shù)據(jù)類型,而無需顯式聲明它們。
模式校驗會拒絕與表不兼容的任何新列或其他模式更改。通過制定和遵守這些高標準,分析人員和工程師可以相信他們的數(shù)據(jù)具有最高的完整性,并且可以清晰地進行推理,從而使他們能夠做出更好的業(yè)務決策。
在另一方面,schema演變通過使schema自動發(fā)生更改變得容易,從而補充了schema的強制校驗。畢竟,添加一列并不難。
schema校驗是架構演進的核心。當一起使用時,這些功能比以往任何時候都更容易阻止噪聲的產(chǎn)生。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
本文題目:如何分析deltalake表schema演進
URL鏈接:http://jinyejixie.com/article0/jopsoo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站排名、關鍵詞優(yōu)化、、響應式網(wǎng)站、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)