全部產品
Search
文件中心

Realtime Compute for Apache Flink:寫入資料

更新時間:Oct 31, 2026

本文為您介紹如何向Fluss表寫入、更新與刪除資料。

寫入資料

  • 主鍵表:可以處理所有類型的訊息(INSERT、UPDATE、DELETE)。

  • 日誌表:只能接收 INSERT 訊息,無法更新或刪除記錄。

  1. 登入Realtime Compute控制台。

  2. 單擊Realtime ComputeFlink工作空間操作列下的控制台。

  3. 在左側導覽列,單擊資料開發 > ETL > 建立流作業。

主建表

CREATE TEMPORARY TABLE source
(
shop_id BIGINT,
user_id BIGINT,
num_orders INT,
total_amount INT,
PRIMARY KEY (shop_id, user_id) NOT ENFORCED
)
WITH ('connector' = 'datagen');

# 寫入部分列
INSERT INTO `fluss-catalog`.`my_db`.`my_pk_tbl` (shop_id, user_id, num_orders)
SELECT shop_id, user_id, num_orders FROM source;

# 寫入全部列
INSERT INTO `fluss-catalog`.`my_db`.`my_pk_tbl`
SELECT * FROM source;

日誌表

CREATE TEMPORARY TABLE source (
order_id BIGINT,
item_id BIGINT,
amount INT,
address STRING
) WITH ('connector' = 'datagen');

INSERT INTO `fluss-catalog`.`my_db`.`my_log_tbl` 
SELECT * FROM source;

寫入負載平衡

上文樣本中,寫入資料按預設分發方式路由到各運算元。當表的 bucket 數與作業並行度不能整除時,預設分發容易造成部分運算元空閑或寫入負載不均。在目標表建表語句的 WITH 參數中配置 sink.distribution-mode 為 BUCKET_BALANCE,有助於改善 sink 運算元利用率與負載分布,實際效果取決於 bucket key 分布。在 bucket 數與 sink 並行度固定時,相同 bucket key 的記錄始終路由到同一 sink 運算元;不保證 bucket 內的寫入順序。

CREATE TABLE `fluss-catalog`.`my_db`.`my_pk_tbl` (
    shop_id BIGINT,
    user_id BIGINT,
    num_orders INT,
    total_amount INT,
    PRIMARY KEY (shop_id, user_id) NOT ENFORCED
) WITH (
    'sink.distribution-mode' = 'BUCKET_BALANCE'
);

INSERT INTO `fluss-catalog`.`my_db`.`my_pk_tbl`
SELECT * FROM source;
  • 該策略適用於 bucket 數與並行度不整除、部分運算元閒置情境;bucket 數與並行度本就匹配時收益有限。

  • 相同 bucket key 的記錄固定路由到同一運算元,因此無法消除熱點 bucket key 導致的寫入傾斜,也不保證所有運算元都有資料。

sink.distribution-mode 預設值為 AUTO,由系統根據表類型自動選擇分發方式。各取值的行為與適用限制如下。

分發模式

行為

適用限制

AUTO

按表類型自動選擇:主鍵表與已定義 bucket.key 的日誌表使用 BUCKET,未定義 bucket.key 的日誌表使用 NONE。

—

NONE

使用 Flink 預設的分發策略,不做額外 shuffle。

—

BUCKET

按 bucket ID 分發,同一 bucket 的資料由同一 sink 運算元處理,可提升用戶端處理效率、降低資源消耗。主鍵表推薦使用。

日誌表僅在定義了 bucket.key 時生效。sink 並行度超過 bucket 數時,部分 sink 運算元可能收不到資料。

BUCKET_BALANCE

允許同一物理 bucket 的不同 bucket key 分配到不同 sink 運算元並發寫入,用於改善 sink 運算元利用率與負載分布。

日誌表必須定義 bucket.key。使用 Aggregation Merge Engine 的表不支援該模式,請改用 AUTO 或 BUCKET:該類表啟用 Undo Recovery,要求每個物理 bucket 由單個 sink 運算元寫入。

PARTITION_DYNAMIC

按分區鍵的流量分布動態調整分發策略,用於均衡分區間負載。適用於分區間資料高度傾斜或分區數較多的情境。

僅支援分區日誌表,不支援主鍵表。存在資料統計收集與額外 shuffle 的開銷。

更新資料

  • 僅支援主鍵表更新資料。

  • 僅支援更新主鍵等值的單條資料。

  1. 在左側導覽列,單擊資料開發 > 資料查詢 > 建立臨時查詢指令碼。

  2. 編寫SQL並選中運行。

    -- 只能支援按照 primary key 的等值條件進行更新
    UPDATE `my-catalog`.`my_db`.`my_pk_tbl` SET total_amount = 2 WHERE shop_id = 10000 and user_id = 123456;

刪除資料

  • 僅支援主鍵表刪除資料。

  • 僅支援刪除主鍵等值的單條資料。

  1. 在左側導覽列,單擊資料開發 > 資料查詢 > 建立臨時查詢指令碼。

  2. 編寫SQL並選中運行。

    -- 只能支援按照 primary key 的等值條件進行刪除
    DELETE FROM `my-catalog`.`my_db`.`my_pk_tbl` WHERE shop_id = 10000 and user_id = 123456;