在以前的博客深入三角洲湖:開箱事務日誌和深入三角洲湖:模式執行&進化,我們描述了三角洲湖事務日誌和內部工作模式的實施和發展。三角洲湖支持DML命令包括(數據操作語言)刪除
,更新
,合並
。這些命令簡化變化數據捕獲(CDC),審計和管理,GDPR / CCPA工作流等等。在這篇文章中,我們將演示如何使用每一個DML命令,幕後描述三角洲湖在做什麼當你運行一個,並為每個人提供一些性能調優技巧。更具體地說:
- 快速入門的三角洲湖ACID事務日誌
- 理解基本運行時刪除、更新和合並
- 理解執行的操作在執行這些任務
- 了解基本的分區修剪在三角洲湖
- 在三角洲湖流查詢如何工作
如果你喜歡看這些信息,您還可以查看深入三角洲湖第3部分:如何刪除、更新和合並工作技術討論。
三角洲湖:基本力學
如果你想知道更多關於三角洲湖的基本力學,請增加以下部分。
單擊以展開
首先,讓我們做一個快速回顧一下如何三角洲湖表結構在文件級別。當你創建一個新表,三角洲將數據保存為一係列的鑲花文件,還創建了_delta_log
文件夾,其中包含三角洲湖事務日誌。ACID事務日誌作為一個主記錄的變化(稱為一個事務)做過你的表。當你修改表(通過添加新的數據或執行更新、合並,或刪除,例如),三角洲湖保存的記錄每一個新事務的JSON文件編號delta_log
文件夾開始00…00000. json
和計數。每10個交易,三角洲也生成一個“檢查點”拚花文件在同一個文件夾,允許讀者迅速重新創建表的狀態。
最終,當你查詢一個三角洲湖表,一個受支持的讀者是指事務日誌迅速確定哪些數據文件表的最新版本。而不是清單文件從您的雲對象商店,提供所需的文件的路徑明顯改善查詢性能。的DML操作,在這篇文章中,我們將討論三角洲湖創建新版本的文件而不是修改到位,使用事務日誌記錄。了解更多通過閱讀本係列前一篇文章中,深入三角洲湖:開箱事務日誌。
現在,您已經有了一個基本的了解在文件係統級別三角洲湖是如何工作的,讓我們深入了解如何使用DML命令在三角洲湖,以及每個操作是如何運作的。下麵的例子將使用SQL語法的一部分三角洲湖0.7.0 3.0和Apache火花;有關更多信息,請參考使火花SQL DDL和DML三角洲湖在Apache 3.0火花。
三角洲湖DML:更新
您可以使用更新
操作有選擇地更新任何行匹配一個過濾條件,也稱為謂詞。下麵的代碼演示了如何使用每種類型的謂詞的一部分更新
聲明。
——更新事件更新事件集eventType=“點擊”在哪裏eventType=“clck”
更新:
三角洲湖執行更新
在兩個步驟:一個表
- 找到並選擇文件包含的數據匹配的謂詞,因此需要更新。三角洲湖使用數據不隻要有可能加速這一過程。
- 每個匹配的文件讀取到內存中,更新相關的行,並寫出結果到一個新的數據文件。
一旦三角洲湖的執行更新
成功,它添加了一個提交的事務日誌顯示新的數據文件將使用舊的從現在開始。然而,舊的數據文件不刪除。相反,它隻是“刪除”——記錄為數據文件,應用到一個舊版本的表,而不是當前版本。三角洲湖能夠使用它來提供數據版本控製和時間旅行。
更新+三角洲湖時間旅行=容易調試
保持舊的數據文件是調試非常有用的,因為您可以使用三角洲湖“時間旅行”回去隨時查詢以前版本的一個表。如果您更新您的表不正確,想找出發生了什麼事,你可以很容易地比較兩個版本的表。
SELECT *從事件的版本作為的12
更新:性能調優技巧
主要改善的性能的方法更新
命令在三角洲湖是添加更多的謂詞來縮小搜索空間。更具體的搜索,減少文件三角洲湖需要掃描和/或修改。
三角洲湖的磚管理版本特性等性能改進改善數據不,布魯姆過濾器的使用z值優化(多維聚簇),它就像一個改進版本的多列排序。z軸次序整理每個數據文件的布局,這樣類似的列值附近戰略上托管的最大效率。閱讀更多關於z順序優化磚。
三角洲湖DML:刪除
您可以使用刪除
命令有選擇地刪除行基於謂詞(過濾條件)。
刪除從事件在哪裏日期
在如果你想要的來恢複意外刪除操作,您可以使用時間旅行來滾回你的表來的方式,作為證明了在下麵的Python代碼片段所示。
<精準醫療>#讀正確版本的表成內存dt=spark.read.format \(“δ”).option (“versionAsOf”,4)\.load (deltaPath)#覆蓋當前的表與DataFrame在內存dt.write.format \(“δ”).mode \(“覆蓋”).save (deltaPath)
刪除:在底層
刪除
工作就像更新
在引擎蓋下。三角洲湖使兩個掃描的數據:首先掃描識別任何數據文件包含謂詞條件匹配的行。第二掃描匹配的數據文件讀入內存,此時三角洲湖之前刪除的行寫出新清潔的數據到磁盤。
三角洲湖後完成刪除
操作成功,舊的數據文件不刪除——他們仍然保留在磁盤上,但記錄為“刪除”(不再活躍的一部分表)三角洲湖事務日誌。記住,那些沒有立即刪除舊文件,因為你可能仍然需要他們時間旅行回到早先版本的表。如果你想刪除文件超過一定的時間,您可以使用真空
命令。
刪除+真空:清理舊的數據文件
運行真空
命令永久刪除所有數據文件:
- 不再主動表的一部分,
- 比保留閾值,默認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
條款,請訪問文檔。
合並:
三角洲湖完成合並
在兩個步驟。
- 執行一個內連接源表和目標表之間選擇所有文件匹配。
- 執行一個外連接所選文件之間在目標和源表和寫出更新/刪除/插入數據。
這不同於一個的主要途徑更新
或者一個刪除
引擎蓋下麵是三角洲湖用途連接完成一個合並
。這個事實讓我們利用一些獨特的策略,尋求提高性能。
合並:性能調優技巧
改進的性能合並
命令,您需要確定它的兩個連接的合並是限製你的速度。
如果內連接瓶頸(例如,發現三角洲湖需要改寫的文件時間太長),嚐試以下策略:
-
- 添加更多謂詞來縮小搜索空間。
- 調整洗牌分區。
- 調整播放加入閾值。
- 緊湊的小文件表中如果有很多他們,但不要壓縮成文件太大型三角洲湖以來複製整個文件重寫它。
磚的三角洲湖管理,使用z值優化利用更新的位置。
另一方麵,如果外連接是瓶頸(即實際重寫文件本身花費的時間太長),試試以下策略:
- 調整洗牌分區。
- 可以為分區表生成許多小文件。
- 減少文件寫道(與之前通過啟用自動重新分區優化寫道在磚三角洲湖)
- 調整播放閾值。如果你做一個完整的外連接,火花就不能做一個廣播加入,但是如果你做一個正確的外連接,火花可以做一個,你可以調整播放所需的閾值。
- 緩存表/ DataFrame來源。
- 緩存源表可以加快第二次掃描,但一定不緩存目標表,因為這可能導致緩存一致性問題。
總結
包括三角洲湖支持DML命令更新
,刪除
,合並成
,大大簡化了許多常見大數據操作的工作流程。在本文中,我們演示了如何使用這些命令在三角洲湖,共享信息對每一個在幕後工作,並提供了一些性能調優技巧。
相關的
在本係列文章:
深入三角洲湖# 1:打開事務日誌
深入三角洲湖# 2:進化模式執行&
深入三角洲湖# 3:DML內部(更新、刪除、合並)
其他資源:
三角洲湖快速入門
磚文檔更新、合並和刪除
簡單,可靠的插入和刪除三角洲湖表上使用Python api