跳轉到主要內容
工程的博客

深入三角洲湖:DML內部(更新、刪除、合並)

2020年9月29日, 工程的博客

分享這篇文章

在以前的博客深入三角洲湖:開箱事務日誌深入三角洲湖:模式執行&進化,我們描述了三角洲湖事務日誌和內部工作模式的實施和發展。三角洲湖支持DML命令包括(數據操作語言)刪除,更新,合並。這些命令簡化變化數據捕獲(CDC),審計和治理和GDPR / CCPA工作流。在這篇文章中,我們將演示如何使用每一個DML命令,幕後描述三角洲湖在做什麼當你運行一個,並為每個人提供一些性能調優技巧。更具體地說:

  • 快速入門的三角洲湖ACID事務日誌
  • 理解基本運行時刪除、更新和合並
  • 理解執行的操作在執行這些任務
  • 了解基本的分區修剪在三角洲湖
  • 在三角洲湖流查詢如何工作

如果你喜歡看這些信息,您還可以查看深入三角洲湖第3部分:如何刪除、更新和合並工作技術討論。

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

得到的早期預覽O ' reilly的新電子書一步一步的指導你需要開始使用三角洲湖。

三角洲湖:基本力學

如果你想知道更多關於三角洲湖的基本力學,請增加以下部分。

三角洲湖DML:更新

您可以使用更新操作有選擇地更新任何行匹配一個過濾條件,也稱為謂詞。下麵的代碼演示了如何使用每種類型的謂詞的一部分更新聲明。

——更新事件更新事件eventType=“點擊”在哪裏eventType=“clck”

更新:

三角洲湖執行更新在兩個步驟:一個表

  1. 找到並選擇文件包含的數據匹配的謂詞,因此需要更新。三角洲湖使用數據不隻要有可能加速這一過程。
  2. 每個匹配的文件讀取到內存中,更新相關的行,並寫出結果到一個新的數據文件。

diving-delta

一旦三角洲湖的執行更新成功,它添加了一個提交的事務日誌顯示新的數據文件將使用舊的從現在開始。然而,舊的數據文件不刪除。相反,它隻是“刪除”——記錄為數據文件,應用到一個舊版本的表,而不是當前版本。三角洲湖能夠使用它來提供數據版本控製和時間旅行。

更新+三角洲湖時間旅行=容易調試

保持舊的數據文件是調試非常有用的,因為您可以使用三角洲湖“時間旅行”回去隨時查詢以前版本的一個表。如果您更新您的表不正確,想找出發生了什麼事,你可以很容易地比較兩個版本的表。

SELECT *事件的版本作為12

更新:性能調優技巧

主要改善的性能的方法更新命令在三角洲湖是添加更多的謂詞來縮小搜索空間。更具體的搜索,減少文件三角洲湖需要掃描和/或修改。

三角洲湖的磚管理版本特性等性能改進改善數據不,布魯姆過濾器的使用z值優化(多維聚簇),它就像一個改進版本的多列排序。z軸次序整理每個數據文件的布局,這樣類似的列值附近戰略上托管的最大效率。閱讀更多關於z順序優化磚

三角洲湖DML:刪除

您可以使用刪除命令有選擇地刪除行基於謂詞(過濾條件)。

刪除事件在哪裏日期
              如果你想要的恢複意外刪除操作,您可以使用時間旅行滾回你的的方式,作為證明了下麵的Python代碼片段所示。
              
#讀正確版本內存dt=spark.read.format(“δ”)\ .option (“versionAsOf”,4)\ .load (deltaPath) #覆蓋當前的DataFrame內存dt.write.format(“δ”)\ .mode(“覆蓋”)\ .save (deltaPath)

刪除:在底層

刪除工作就像更新在引擎蓋下。三角洲湖使兩個掃描的數據:首先掃描識別任何數據文件包含謂詞條件匹配的行。第二掃描匹配的數據文件讀入內存,此時三角洲湖之前刪除的行寫出新清潔的數據到磁盤。

三角洲湖後完成刪除操作成功,舊的數據文件不刪除——他們仍然保留在磁盤上,但記錄為“刪除”(不再活躍的一部分表)三角洲湖事務日誌。記住,那些沒有立即刪除舊文件,因為你可能仍然需要他們時間旅行回到早先版本的表。如果你想刪除文件超過一定的時間,您可以使用真空命令。

刪除+真空:清理舊的數據文件

運行真空命令永久刪除所有數據文件:

  1. 不再主動表的一部分,
  2. 比保留閾值,默認7天。

三角洲湖並不會自動真空舊文件,你必須運行該命令自己,如下所示。如果你想指定一個停留時間不同於默認7天,你可以提供它作為參數。

delta.tables進口*#真空比默認不需要的文件版本#保存期,默認168小時(7天)dt.vacuum ()deltaTable.vacuum (48)#真空文件超過48小時
警告:運行真空的保存期0小時將刪除所有文件中未使用最新版本的表。確保你沒有運行這個命令雖然有活躍寫入表中進步,在可能發生數據丟失。

更多的信息真空命令,以及它在Scala和SQL的例子,看一看真空命令的文檔

刪除:性能調優技巧

就像與更新命令,主要改善的性能的方法刪除操作三角洲湖是添加更多的謂詞來縮小搜索空間。三角洲湖的磚管理版本還包括其他性能改進,如改進數據不,布魯姆過濾器的使用z值優化(多維聚簇)。閱讀更多關於z順序優化磚

三角洲湖DML:合並

三角洲湖合並命令允許您執行“插入”,這是一個混合的更新和一個插入。理解upsert,假設您有一個現有表(又名目標表),源表包含新記錄和更新現有的記錄。這裏有一個插入是如何工作的:

  • 當一個記錄從源表中匹配一個既存的記錄在目標表,三角洲湖更新備案。
  • 當有沒有這樣的比賽湖,δ插入新紀錄。
合並事件使用更新events.eventId=updates.eventId匹配然後更新events.data=updates.data匹配然後插入(日期eventId,數據)(日期eventId,數據)

三角洲湖合並命令極大地簡化了工作流程,可以與其他傳統的複雜和繁瑣的數據格式像拚花。常見的場景合並/ upsert派上用場包括變化數據捕獲,GDPR / CCPA合規,sessionization,重複數據刪除的記錄。關於插入的更多信息,閱讀博客高效的插入到數據與磚湖泊三角洲,簡單,可靠的插入和刪除三角洲湖表上使用Python API,模式演化在三角洲湖的合並操作和運營指標

更深入的信息合並編程操作,包括使用的條件whenMatched條款,請訪問文檔

合並:

三角洲湖完成合並在兩個步驟。

  1. 執行一個內連接源表和目標表之間選擇所有文件匹配。
  2. 執行一個外連接所選文件之間在目標和源表和寫出更新/刪除/插入數據。

三角洲湖下罩:使用MERGE命令合並文件。

這不同於一個的主要途徑更新或者一個刪除引擎蓋下麵是三角洲湖用途連接完成一個合並。這個事實讓我們利用一些獨特的策略,尋求提高性能。

合並:性能調優技巧

改進的性能合並命令,您需要確定它的兩個連接的合並是限製你的速度。

如果內連接瓶頸(例如,發現三角洲湖需要改寫的文件時間太長),嚐試以下策略:

    • 添加更多謂詞來縮小搜索空間。
    • 調整洗牌分區。
    • 調整播放加入閾值。
    • 緊湊的小文件表中如果有很多他們,但不要壓縮成文件大型三角洲湖以來複製整個文件重寫它。
磚的三角洲湖管理,使用z值優化利用更新的位置。

另一方麵,如果外連接是瓶頸(即實際重寫文件本身花費的時間太長),試試以下策略:

  • 調整洗牌分區。
    • 可以為分區表生成許多小文件。
    • 減少文件寫道(與之前通過啟用自動重新分區優化寫道磚三角洲湖)
  • 調整播放閾值。如果你做一個完整的外連接,火花就不能做一個廣播加入,但是如果你做一個正確的外連接,火花可以做一個,你可以調整播放所需的閾值。
  • 緩存表/ DataFrame來源。
    • 緩存源表可以加快第二次掃描,但一定不緩存目標表,因為這可能導致緩存一致性問題。

總結

包括三角洲湖支持DML命令更新,刪除,合並成,大大簡化了許多常見大數據操作的工作流程。在本文中,我們演示了如何使用這些命令在三角洲湖,共享信息對每一個在幕後工作,並提供了一些性能調優技巧。

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

相關的

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

其他資源:
三角洲湖快速入門
磚文檔更新、合並和刪除
簡單,可靠的插入和刪除三角洲湖表上使用Python api

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map