如何分析deltalake表schema演進

如何分析delta lake表schema演進,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)主營鐵東網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),鐵東h5微信平臺小程序開發(fā)搭建,鐵東網(wǎng)站營銷推廣歡迎鐵東等地區(qū)企業(yè)咨詢

下面主要是深入探究一下delta lake的schema演變。

數(shù)據(jù),就像我們的經(jīng)驗一樣,總是在不斷發(fā)展和積累。為了跟上時代的步伐,我們的思維模式必須適應(yīng)新數(shù)據(jù),其中一些包含新的維度-一種新的方式來查看我們以前從未想到的事物。這些思維模式與表的schema沒有什么不同,它們定義了我們?nèi)绾螌π滦畔⑦M行分類和處理。

隨著業(yè)務(wù)問題和需求的發(fā)展,數(shù)據(jù)的結(jié)構(gòu)也將隨之變化。使用Delta Lake,隨著數(shù)據(jù)的變化,合并新維度變得容易。用戶可以使用簡單的語義來控制其表的schema。這些工具包括schema校驗(可防止用戶因錯誤或垃圾數(shù)據(jù)而無意中污染其表)以及schema演進(也就是為了豐富數(shù)據(jù)而增加一些新的列)。

了解表schema

Apache Spark?中的每個DataFrame都包含一個schema,定義了數(shù)據(jù)的格式,例如數(shù)據(jù)類型和列以及元數(shù)據(jù)。使用Delta Lake,表的schema以JSON格式保存在事務(wù)日志中。

什么是schema校驗?

schema校驗是Delta Lake中的一種安全措施,它通過拒絕對表的schema不匹配的寫入來確保數(shù)據(jù)質(zhì)量。就像忙碌的餐廳的前臺經(jīng)理只接受預(yù)訂一樣,它會檢查插入表中的數(shù)據(jù)中的每一列是否在其預(yù)期列的列表中(換句話說,每一列是否都有“預(yù)訂”),以及拒絕所有不在列表中的列的寫操作。

schema 校驗如何工作?

Delta Lake 在write操作上使用schema驗證,這意味著在寫入時會檢查對表的所有新寫入是否與目標(biāo)表的schema兼容。如果schema不兼容,則Delta Lake將完全取消事務(wù)(不寫入任何數(shù)據(jù)),并引發(fā)異常以使用戶知道不匹配的情況。

為了確定對表的寫入是否兼容,Delta Lake使用以下規(guī)則。要寫入的DataFrame:

  • 不能包含目標(biāo)表的架構(gòu)中不存在的任何其他列。相反輸入的數(shù)據(jù)不包含表中的某些列是可以的,這些列將被簡單地分配為空值。

  • 列的數(shù)據(jù)類型不能與目標(biāo)表中的列數(shù)據(jù)類型不同。如果目標(biāo)表的列包含StringType數(shù)據(jù),但DataFrame中的相應(yīng)列包含IntegerType數(shù)據(jù),則schema強制實施將引發(fā)異常并阻止進行寫操作。

  • 不能包含僅大小寫不同的列名。這意味著不能在同一表中定義諸如“ Foo”和“ foo”之類的列。盡管Spark可用于區(qū)分大小寫或不區(qū)分大小寫(默認)模式,但是Delta Lake保留大小寫,卻在存儲schema時不區(qū)分大小寫。存儲和返回列信息時,Parquet區(qū)分大小寫。為了避免潛在的錯誤,數(shù)據(jù)損壞或丟失問題,才添加此限制。

為了說明,請看下面的代碼,當(dāng)試圖將一些新計算的列追加到不兼容它們的delta lake表的時候,將發(fā)生什么。

# Generate a DataFrame of loans that we'll append to our Delta Lake tableloans = 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 schemaoriginal_loans.printSchema()
"""root  |-- addr_state: string (nullable = true)  |-- count: integer (nullable = true)"""
# Show new DataFrame's schemaloans.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 tableloans.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并阻止寫入。為了幫助確定導(dǎo)致不匹配的列,Spark在堆棧跟蹤中打印出了兩種schema以進行比較。

模式校驗有何用處?

由于這種檢查非常嚴格,所以數(shù)據(jù)可以直接用于生產(chǎn)環(huán)境。常見的使用場景如下:

  • 機器學(xué)習(xí)算法

  • BI儀表板

  • 數(shù)據(jù)分析和可視化工具

  • 任何需要高度結(jié)構(gòu)化,強類型語義schema的生產(chǎn)系統(tǒng)

防止數(shù)據(jù)稀疏

強制性的schema校驗,可能會導(dǎo)致大家在編寫spark任務(wù)的時候拘束比較多,一遇到schema不兼容任務(wù)就會崩潰,這個可能是會令人頭疼。

但是假設(shè)不對schema進行校驗,那么隨時可能新增列,導(dǎo)致表變的越來越稀疏。其實,這也是一種性能消耗。

所以,schema校驗也有防止數(shù)據(jù)變的越來越稀疏的作用。

什么是schema演變?

schema演變簡單來數(shù)就是表的schema會隨著數(shù)據(jù)的變化而變化。最常見的是,在執(zhí)行附加或覆蓋操作時使用它來自動調(diào)整schema以包括一個或多個新列。

schema演變?nèi)绾喂ぷ鳎?/h3>

配置很簡單,通過添加 .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)計圖:

如何分析delta lake表schema演進

通過mergeSchema設(shè)置為true,DataFrame中存在但目標(biāo)表中不存在的所有列將作為寫事務(wù)的一部分自動添加到schema的末尾。還可以添加嵌套字段,并且這些字段也將添加到其各自的struct列的末尾。

數(shù)據(jù)工程師和科學(xué)家可以使用此選項在其現(xiàn)有的機器學(xué)習(xí)生產(chǎn)表中添加新列(也許是新跟蹤的指標(biāo),或本月銷售數(shù)字的列),而不會破壞依賴舊列的現(xiàn)有模型。

在表追加或覆蓋期間,以下類型的模式更改可用于schema演變:

  • 添加新列(這是最常見的情況)

  • 從NullType->任何其他類型更改數(shù)據(jù)類型,或從ByteType-> ShortType-> IntegerType更改數(shù)據(jù)

其他不適合架構(gòu)演變的更改要求通過添加.option("overwriteSchema", "true")來覆蓋schema和數(shù)據(jù)。例如,在“ Foo”列最初是integer數(shù)據(jù)類型,而新模式將是字符串?dāng)?shù)據(jù)類型的情況下,則需要重寫所有Parquet(數(shù)據(jù))文件。這些更改包括:

  • 刪除列

  • 更改現(xiàn)有列的數(shù)據(jù)類型

  • 重命名僅因大小寫而異的列名(例如“ Foo”和“ foo”)

最后,在Spark 3.0中,ALTER TABLE將完全支持顯式DDL,從而允許用戶對表schema執(zhí)行以下操作:

  • 添加列

  • 更改列注釋

  • 設(shè)置定義表行為的表屬性,例如設(shè)置事務(wù)日志的保留期限

模式演化有何用處?

在打算更改表的schema時可以使用模式演變。這是遷移架構(gòu)的最簡單方法,因為它會自動添加正確的列名稱和數(shù)據(jù)類型,而無需顯式聲明它們。

模式校驗會拒絕與表不兼容的任何新列或其他模式更改。通過制定和遵守這些高標(biāo)準(zhǔn),分析人員和工程師可以相信他們的數(shù)據(jù)具有最高的完整性,并且可以清晰地進行推理,從而使他們能夠做出更好的業(yè)務(wù)決策。

在另一方面,schema演變通過使schema自動發(fā)生更改變得容易,從而補充了schema的強制校驗。畢竟,添加一列并不難。

schema校驗是架構(gòu)演進的核心。當(dāng)一起使用時,這些功能比以往任何時候都更容易阻止噪聲的產(chǎn)生。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

本文題目:如何分析deltalake表schema演進
URL鏈接:http://muchs.cn/article0/jopsoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站排名、關(guān)鍵詞優(yōu)化、、響應(yīng)式網(wǎng)站、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)