本文為您介紹如何向Fluss表寫入、更新與刪除資料。
寫入資料
-
主鍵表:可以處理所有類型的訊息(INSERT、UPDATE、DELETE)。
-
日誌表:只能接收 INSERT 訊息,無法更新或刪除記錄。
-
單擊Realtime ComputeFlink工作空間操作列下的控制台。
-
在左側導覽列,單擊。
主建表
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,由系統根據表類型自動選擇分發方式。各取值的行為與適用限制如下。
|
分發模式 |
行為 |
適用限制 |
|
|
按表類型自動選擇:主鍵表與已定義 |
— |
|
|
使用 Flink 預設的分發策略,不做額外 shuffle。 |
— |
|
|
按 bucket ID 分發,同一 bucket 的資料由同一 sink 運算元處理,可提升用戶端處理效率、降低資源消耗。主鍵表推薦使用。 |
日誌表僅在定義了 |
|
|
允許同一物理 bucket 的不同 bucket key 分配到不同 sink 運算元並發寫入,用於改善 sink 運算元利用率與負載分布。 |
日誌表必須定義 |
|
|
按分區鍵的流量分布動態調整分發策略,用於均衡分區間負載。適用於分區間資料高度傾斜或分區數較多的情境。 |
僅支援分區日誌表,不支援主鍵表。存在資料統計收集與額外 shuffle 的開銷。 |
更新資料
-
僅支援主鍵表更新資料。
-
僅支援更新主鍵等值的單條資料。
-
在左側導覽列,單擊。
-
編寫SQL並選中運行。
-- 只能支援按照 primary key 的等值條件進行更新 UPDATE `my-catalog`.`my_db`.`my_pk_tbl` SET total_amount = 2 WHERE shop_id = 10000 and user_id = 123456;
刪除資料
-
僅支援主鍵表刪除資料。
-
僅支援刪除主鍵等值的單條資料。
-
在左側導覽列,單擊。
-
編寫SQL並選中運行。
-- 只能支援按照 primary key 的等值條件進行刪除 DELETE FROM `my-catalog`.`my_db`.`my_pk_tbl` WHERE shop_id = 10000 and user_id = 123456;