全部產品
Search
文件中心

MaxCompute:部分列更新

更新時間:Aug 20, 2024

當前Delta Table支援對部分列進行更新。即對錶執行插入或更新操作時,只需要在SQL中指定您想修改的目標列及其新資料,而無需包含表中的所有列。插入資料時,未被賦值的列會自動被填充為NULL;更新資料時,未被賦值的列保持不變。在多數情境下可大幅提升執行效率,節省儲存成本。本文用具體樣本為您展示如何在Delta Table中插入或更新部分列的資料。

例如某些典型的數倉業務中包含一些星型模式的資料表,表主鍵相同,需要將所有資料表按照主鍵合并為一張大寬表,用於後續的計算和統計,不同的資料表完全可以單獨並發寫入與其相關的列,互不影響,讀取大寬表時再將其合并成完整的資料行進行輸出,相比只能寫入所有列的用法,部分列更新可以極大地提升寫入和讀取的效能,也能節省儲存成本。

注意事項

  • 表類型必須為Delta Table。

  • 支援分區表和非分區表。

  • 執行前您需要開啟支援部分列更新的開關SET odps.sql.upsertable.table.enable=true;,預設已開啟。

SQL樣本

樣本資料

建立Delta Table表delta_target

CREATE TABLE delta_target
(
    key  BIGINT NOT NULL PRIMARY KEY, 
    b   STRING, 
    c   BIGINT
)
TBLPROPERTIES ("acid.partial.fields.update.enable" = "true","transactional" = "true")
;

INSERT OVERWRITE/INSERT INTO

此處以樣本資料為例,為您展示在Delta Table中,如何使用INSERT OVERWRITE/INSERT INTO插入部分列資料。

  • 預設c列,c列自動補充為NULL。

    INSERT INTO TABLE delta_target(key, b) VALUES(1, '1');
    
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 1          | 1          | NULL       |
    +------------+------------+------------+
  • 預設b列,插入相同主鍵資料,相當於更新當前資料。

    INSERT INTO TABLE delta_target(key, c) VALUES(1, 1);
    
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 1          | 1          | 1          |
    +------------+------------+------------+
  • 預設c列,插入相同主鍵資料,相當於更新當前資料。

    INSERT INTO TABLE delta_target(key, b) VALUES(1, '11');
    
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 1          | 11         | 1          |
    +------------+------------+------------+
  • 不預設,插入資料與當前主鍵不同,即新增一條資料。

    INSERT INTO TABLE delta_target VALUES(2, '2', 2);
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 2          | 2          | 2          |
    | 1          | 11         | 1          |
    +------------+------------+------------+

更多關於INSERT OVERWRITE/INSERT INTO的資訊請參見插入或覆寫資料(INSERT INTO | INSERT OVERWRITE)

UPDATE/DELETE

本文在INSERT OVERWRITE/INSERT INTO樣本的基礎上,為您展示如何使用UPDATE/DELETE更新部分列資料。

  • 預設c列,更新key=1的資料行。

    UPDATE delta_target SET b='111' WHERE key=1;
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 2          | 2          | 2          |
    | 1          | 111        | 1          |
    +------------+------------+------------+
  • 預設c列,更新key=2的資料行。

    UPDATE delta_target SET b='222' WHERE key=2;
    SELECT * FROM delta_target;

    返回結果:

    +------------+------------+------------+
    | key        | b          | c          |
    +------------+------------+------------+
    | 2          | 222        | 2          |
    | 1          | 111        | 1          |
    +------------+------------+------------+

更多關於UPDATE/DELETE的資訊請參見更新或刪除資料(UPDATE | DELETE)

MERGE INTO

本文在UPDATE/DELETE樣本的基礎上,為您展示如何使用MERGE INTO合并資料。

-- 建立acid2_dml_pu_source表
CREATE TABLE acid2_dml_pu_source AS 
SELECT
    key,b,c 
FROM VALUES 
(1,'10',10), 
(2,'20',20), 
(3,'30',30), 
(4,'40',40), 
(5,'50',50), 
(6,'60',60) t (key,b,c);

-- 執行合併作業
MERGE INTO delta_target AS t USING acid2_dml_pu_source AS s ON s.key = t.key WHEN matched THEN UPDATE SET t.b = s.b WHEN NOT matched THEN INSERT (key, b) VALUES(s.key, s.b);

返回結果:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 3          | 30         | NULL       |
| 4          | 40         | NULL       |
| 5          | 50         | NULL       |
| 6          | 60         | NULL       |
| 2          | 20         | 2          |
| 1          | 10         | 1          |
+------------+------------+------------+

更多關於MERGE INTO的資訊請參見MERGE INTO