跳轉到主要內容
公司博客上

深入三角洲湖:模式執行&進化

分享這篇文章

在磚試試這個筆記本係列

標誌

數據,像我們的經曆,總是演變和積累。繼續,我們對世界的心智模式必須適應新數據,其中一些包含新的維度,我們沒有看到事情的新方法的概念。這些思維模式並不與表的模式,定義如何分類和處理新信息。

這給我們帶來了模式管理。隨著業務問題和需求的發展隨著時間的推移,也會你的數據的結構。與三角洲湖,隨著數據的變化,將新的維度是很容易的。用戶獲得簡單的語義控製模式的表。這些工具包括模式執行,這可以防止用戶不小心汙染與錯誤的表或垃圾數據,以及模式演化,這使他們能夠自動添加新列屬於當這些豐富的數據列。在這個博客中,我們將深入的使用這些工具。

理解表模式

每個DataFrame Apache火花™包含一個模式,一個藍圖,它定義的形狀數據,如數據類型和列,和元數據。三角洲湖,表的模式是JSON格式保存在內部事務日誌。

執行模式是什麼?

模式執行,也被稱為模式驗證,是三角洲湖的維護,確保數據質量拒絕寫入一個表,表的模式不一致。像前台經理繁忙的餐廳隻接受預訂,它檢查是否數據插入到表中每一列是在其預期的列表列(換句話說,是否每一個都有一個“預訂”),並拒絕任何寫列沒有上榜。

執行模式是如何工作的呢?

三角洲湖使用模式驗證在寫,這意味著所有新寫入表檢查兼容性與目標表的模式寫時間。如果模式不兼容,三角洲湖完全取消交易(沒有數據寫入),並提出了一個異常,讓用戶了解不匹配。

決定寫一個表是否兼容,三角洲湖使用以下規則。DataFrame編寫:

  • 不能包含任何額外的列不存在目標表的模式。相反的,沒關係,如果傳入的數據不包含表中的每一列,這些列將被分配null值。
  • 不能有不同的列數據類型的列的數據類型在目標表中。如果一個目標表的列包含StringType數據,但相應的列DataFrame包含IntegerType數據,模式的實施將引發一個異常,防止寫操作。
  • 不能隻包含列名不同的情況。這意味著您不能列如“Foo”和“Foo”定義在相同的表。當火花可用於區分大小寫或不敏感(默認)模式下,三角洲湖case-preserving但不敏感當存儲模式。拚花是大小寫敏感的,當存儲和返回列信息。為了避免潛在的錯誤,數據損壞或損失的問題(我們親自經曆過在磚),我們決定把這一限製。

為了說明這一點,看看下麵的代碼會發生什麼當試圖添加一些新計算列一套三角洲湖表,還沒有接受它們。

#生成DataFrame貸款,我們會添加到我們的三角洲湖表< / span >貸款= sql (< / span >”“”< / span >選擇addr_state,演員(蘭德(10)*算作bigint)計數,< / span >鑄造(蘭德(10)* 10000 *算作雙)數量< / span >從loan_by_state_delta< / span >”“”< / span >)< / span >#顯示原始DataFrame的模式< / span >original_loans.printSchema ()”“”< / span >根< / span >|——addr_state:字符串(nullable = true)< / span >|——數:整數(nullable = true)< / span >”“”< / span >#顯示新DataFrame的模式< / span >loans.printSchema ()”“”< / span >根< / span >|——addr_state:字符串(nullable = true)< / span >|——數:整數(nullable = true)< / span >|——數量:雙(nullable = true) #新列< / span >”“”< / span >#嚐試添加新DataFrame現有表(新列)< / span >loans.write。< / span >格式< / span >(< / span >“δ”< / span >)\< / span >.mode (< / span >“添加”< / span >)\< / span >。save (DELTALAKE_PATH)”“”返回:< / span >< span風格= "顏色:紅色;" >< / span >模式不匹配時發現寫作三角洲表。< / span >要啟用模式遷移,請設置:< / span >”。選項(“mergeSchema”,“真正的”)\ '< / span >表模式:< / span >根< / span >——addr_state:字符串(nullable = true)< / span >——數:長(可空= true)< / span >數據模式:< / span >根< / span >——addr_state:字符串(nullable = true)< / span >——數:長(可空= true)< / span >——數量:雙(nullable = true)< / span >如果啟用了acl表,這些選項將被忽略。請使用ALTER TABLE命令改變模式。< / span >< / span >< / span >”“”< / span >

而不是自動添加新列,三角洲湖執行模式和停止寫的發生。幫助確定哪些列(s)導致不匹配,火花打印出這兩個堆棧跟蹤模式的比較。

模式是如何執行有用嗎?

因為它是這樣一個嚴格的檢查,執行模式是一個很好的工具使用幹淨的看門人,完全改變了數據集,準備生產或消費。通常執行表,直接飼料:

  • 機器學習算法
  • BI儀表板
  • 數據分析和可視化工具
  • 任何生產係統要求高度結構化,強類型、語義模式

為了他們的數據準備最後的障礙,許多用戶使用一個簡單的“種”架構,逐步補充道結構表。為了了解更多,看看文章題為與三角洲湖Productionizing機器學習

當然,執行模式可以使用在你的管道,但請注意,這有點令人沮喪的流寫入一個表失敗,因為你忘了你單個列添加到輸入數據,例如。

防止數據被稀釋

在這一點上,你可能會問自己,有什麼值得大驚小怪的?畢竟,有時一個意想不到的“模式不匹配”的錯誤可能會使您在您的工作流,特別是如果你新三角洲湖。為什麼不讓模式改變但是它需要這樣我可以寫DataFrame不管什麼?

正如老話所說,“一盎司的預防勝過一磅的治療。”At some point, if you don't enforce your schema, issues with data type compatibility will rear their ugly heads - seemingly homogenous sources of raw data can contain edge cases, corrupted columns, misformed mappings, or other scary things that go bump in the night. A much better approach is to stop these enemies at the gates - using schema enforcement - and deal with them in the daylight rather than later on, when they'll be lurking in the shadowy recesses of your production code.

模式的實施提供了內心的寧靜,你的表的模式不會改變,除非你使肯定的選擇改變它。它可以防止數據“稀釋”,可以發生在新列如此頻繁的附加,以前富有,簡明表失去意義和實用性由於海量數據。通過鼓勵你故意,設定高標準,並期望高質量、執行模式是做它是為了做什麼——讓你誠實的,和你的桌子幹淨。

在進一步審查,如果你真的決定做了想添加新列,這是一個很簡單的,一線解決,下麵討論。解決方案模式演化!

模式演化是什麼?

模式演化是一個功能,允許用戶輕鬆地更改一個表的當前模式以適應隨時間變化的數據。執行時最常見的,它是使用一個附加或覆蓋操作,自動調整模式包括一個或更多的新列。

模式演化是如何工作的呢?

跟進從上一節的例子中,開發人員可以很容易地使用模式演化來添加新列,以前拒絕了由於模式不匹配。模式演化是通過添加激活.option (“mergeSchema”,“真正的”)到你的.write.writeStream火花命令。

#添加mergeSchema選項< / span >loans.write。< / span >格式< / span >(< / span >“δ”< / span >)\< / span >.option (< / span >“mergeSchema”< / span >,< / span >“真正的”< / span >)\< / span >.mode (< / span >“添加”< / span >)\< / span >。save (DELTALAKE_SILVER_PATH)

要查看情節,執行以下SQL語句的火花。

#< / span >創建< / span >一個陰謀< / span >與< / span >的< / span >新< / span >列< / span >來< / span >確認寫成功< / span >%< / span >sql< / span >選擇< / span >addr_state,< / span >總和< / span >(“金額”)< / span >作為< / span >量< / span >從< / span >loan_by_state_delta< / span >集團< / span >通過< / span >addr_state< / span >訂單< / span >通過< / span >總和< / span >(“金額”)< / span >DESC< / span >限製< / span >10< / span >

條形圖顯示了每個國家的貸款數量成功使用模式後執法和模式演化。

此外,您可以設置該選項為整個火花會話通過添加火花配置spark.databricks.delta.schema.autoMerge = True。小心使用,因為模式的實施將不再提醒你是意想不到的模式不匹配。

通過包括mergeSchema查詢選項,DataFrame中的任何列存在但不是目標表中自動添加到結束的模式寫事務的一部分。嵌套也可以添加字段,這些字段會被添加到各自的struct列的結束。

數據工程師和科學家可以使用這個選項來添加新列(也許一個新指標跟蹤,或本月的銷售數字的列)現有的機器學習生產表在不破壞現有的模型依賴於舊的列。

以下類型的模式變化有資格獲得模式演化期間表附加或覆蓋:

  • 添加新列(這是最常見的場景)
  • 改變數據類型的NullType - >其他類型,或向上的ByteType - > ShortType - > IntegerType

其他的變化,沒有資格獲得模式演化,要求架構和數據被覆蓋通過添加.option (“overwriteSchema”,“真正的”)。例如,在情況列“Foo”最初是一個整數數據類型和新模式將是一個字符串數據類型,那麼所有的拚花(數據)文件需要重寫。這些變化包括:

  • 刪除列
  • 改變現有的列的數據類型(地方)
  • 重命名列名稱,隻有情況(如不同。“Foo”和“Foo”)

最後,與即將發布的3.0火花,顯式的DDL(使用ALTER TABLE)將完全支持,允許用戶對表執行以下操作模式:

  • 添加列
  • 改變列的評論
  • 設置表的屬性定義表的行為,例如設置事務日誌的保留時間

模式演化是如何有用嗎?

模式演化可以任何時候你使用意願改變你的表的模式(而不是你不小心添加列DataFrame不應該有)。這是最簡單的方法遷移你的模式,因為它自動添加正確的列名稱和數據類型,而不需要顯式地聲明它們。

總結

模式執行拒絕任何新列或其他變化,不兼容你的表。通過設置和維護這些高標準,分析師和工程師可以信任他們的數據完整性的最高水平,並思考清晰,允許他們做出更好的業務決策。

在硬幣的另一麵,模式演化補充實施方便目的自動模式變化發生。畢竟,它不應該很難添加一列。

模式的實施是陰模式演化的陽。一起使用時,這些特性使它比以往更容易阻擋噪音,和調優的信號。

我們還要感謝成員Mukul沒吃,Pranav Anand這個博客為他們的貢獻。

對開源三角洲湖感興趣嗎?
訪問在線三角洲湖中心要了解更多,請下載最新的代碼,並加入三角洲湖社區。

相關的

在本係列文章:
深入三角洲湖# 1:打開事務日誌
深入三角洲湖# 2:進化模式執行&
深入三角洲湖# 3:DML內部(更新、刪除、合並)

玩這個視頻,請點擊這裏,接受餅幹

與三角洲湖Productionizing機器學習
湖是什麼數據?

免費試著磚

相關的帖子

看到所有公司博客上的帖子
Baidu
map