全部產品
Search
文件中心

AnalyticDB:通過Spark SQL讀寫Hudi外表

更新時間:Sep 06, 2024

Apache Hudi(簡稱Hudi)是基於OSSObject Storage Service的一種表格式,支援UPDATE、DELETE和INSERT操作。AnalyticDB for MySQL和Hudi做了深度整合,您可以通過Spark SQL讀寫Hudi外表。本文主要介紹如何通過Spark SQL讀寫Hudi外表。

前提條件

  • 叢集的產品系列為湖倉版

    說明

    湖倉版叢集儲存預留資源需大於0 ACU。

  • 已在湖倉版叢集中建立Job型資源群組。具體操作,請參見建立資源群組

  • 已建立湖倉版叢集的資料庫帳號。

步驟一:進入資料開發

  1. 登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單,在湖倉版頁簽下,單擊目的地組群ID。

  2. 在左側導覽列,單擊作業開發 > SQL開發

  3. SQLConsole視窗,選擇Spark引擎和Job型資源群組。

步驟二:建立外庫與Hudi外表

說明

您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式

  1. 執行以下語句,建立資料庫。如果已有資料庫,可跳過本步驟。

    CREATE DATABASE adb_external_db_hudi
    location 'oss://<bucket_name>/test/';    /*用於在該路徑中建立表,請替換為自己的OSS路徑。*/
  2. 執行以下語句,建立Hudi外表。

    CREATE TABLE adb_external_db_hudi.test_hudi_tbl (
     `id` int,
     `name` string,
     `age` int
    ) using hudi 
    tblproperties
     (primaryKey = 'id', 
      preCombineField = 'age') 
      partitioned by (age) 
    location 'oss://<bucket_name>/test/table/';  /*寫入的資料會儲存在該路徑中,請替換為自己的OSS路徑。*/
    重要
    • OSS路徑中的Bucket需與建立資料庫所選的Bucket相同。

    • 建立外表時選擇的OSS路徑需比建立資料庫時選擇的OSS路徑至少多一層目錄,且外表的路徑需在資料庫路徑下。

    • 建表時必須定義primaryKey主鍵。preCombineField預彙總欄位為可選,如未定義preCombineField,則在UPDATE情境會報錯。

步驟三:寫入Hudi外表資料

說明

您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式

INSERT

執行以下語句,寫入資料。您可以選擇以下任意一種方式向Hudi外表中寫入資料。

  • 方式一:INSERT INTO寫入

    INSERT INTO adb_external_db_hudi.test_hudi_tbl values(1, 'lisa', 10),(2, 'jams', 10);
  • 方式二:INSERT OVERWRITE全表寫入

    INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl values (1, 'lisa', 10), (2, 'jams', 20);
  • 方式三:INSERT OVERWRITE靜態分區寫入

    INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl partition(age=10) values(1, 'anna');
  • 方式四:INSERT OVERWRITE動態分區寫入

    INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl partition (age) values (1, 'bom', 10);

UPDATE

執行以下語句更新資料,本文以將id=2的name列更新為box為例。

UPDATE adb_external_db_hudi.test_hudi_tbl SET name = 'box' where id = 2;

DELETE

執行以下語句刪除資料,本文以刪除id列為1的資料為例。

DELETE FROM adb_external_db_hudi.test_hudi_tbl where id = 1;

並發控制

Hudi外表基於LockProvider的並發控制機制,避免執行DML操作時出現並發衝突。多個任務可以同時寫入不同的資料範圍,為了避免寫入衝突,需要確保沒有重疊的資料範圍寫入,從而保證了資料的正確性和一致性。您需要配置以下參數來啟用並發控制。詳細Hudi的並發控制機制請參見Apache Hudi

說明

若使用開源Hudi JAR包,暫不支援MdsBasedLockProvider實現並發控制。

set hoodie.cleaner.policy.failed.writes=LAZY;
set hoodie.write.concurrency.mode=OPTIMISTIC_CONCURRENCY_CONTROL;
set hoodie.write.lock.provider=org.apache.hudi.sync.adb.MdsBasedLockProvider;

參數說明:

參數

參數值

是否必填

描述

hoodie.cleaner.policy.failed.writes

LAZY

指定寫入失敗時的髒資料清理策略。

取值為LAZY,表示寫入提交前不清理未完成的提交,失敗的提交待心跳到期後由Clean操作統一清理,適用多個並發寫入的情境。

hoodie.write.concurrency.mode

OPTIMISTIC_CONCURRENCY_CONTROL

寫入操作的併發模式。取值為

OPTIMISTIC_CONCURRENCY_CONTROL,表示一個Hudi外表如果同時有多個寫入任務,每個寫入任務提交前都會檢查是否存在提交衝突,衝突情況下本次寫入失敗。

hoodie.write.lock.provider

org.apache.hudi.sync.adb.MdsBasedLockProvider

鎖提供者類名,使用者可以提供自己的LockProvider實現,提供的類必須是org.apache.hudi.common.lock.LockProvider的子類。

步驟四:查詢資料

說明
  • 您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式

  • 執行Spark SQL語句,只返回執行成功或者失敗,不返回資料。您可以在Spark Jar開發頁面應用列表頁簽中的日誌查看錶資料。詳情請參見查看Spark應用資訊

執行以下語句,查詢Hudi外表資料。

SELECT * FROM adb_external_db_hudi.test_hudi_tbl;