Delta テーブルの特定の列のデータを更新できます。テーブルにデータを挿入する場合、またはテーブルのデータを更新する場合は、変更する列と新しいデータを SQL 文で指定するだけで済みます。この方法では、テーブルのすべての列に対して操作を実行する必要はありません。データの挿入中、値のない列には自動的に NULL が入力されます。データの更新中、値のない列は変更されません。これは、ほとんどのシナリオで操作効率を向上させ、ストレージ コストを削減するのに役立ちます。このトピックでは、Delta テーブルの特定の列にデータを挿入または更新する方法の例を示します。
典型的なデータ ウェアハウス ビジネスには、スタースキーマを使用するデータ テーブルがあり、テーブルのプライマリ キーは同じです。後続の計算と統計のためにすべてのテーブルをプライマリ キーに基づいて 1 つの大きなワイド テーブルにマージする必要がある場合、異なるテーブルのデータを個別に関連する列に並行して書き込むことができます。システムが大きなワイド テーブルを読み取ると、システムはデータを完全なデータ行にマージして出力します。すべての列にデータを書き込む方法と比較して、特定の列のデータを更新する方法は、書き込みと読み取りのパフォーマンスを大幅に向上させ、ストレージ コストを削減できます。
注意事項
テーブル タイプは Delta テーブルである必要があります。
パーティション テーブルと非パーティション テーブルの特定の列のデータを更新できます。
SQL 文の例
サンプル コード
delta_target という名前の Delta テーブルを作成します。
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
サンプル コードは、INSERT OVERWRITE または INSERT INTO 文を使用して Delta テーブルの特定の列にデータを挿入する方法を示しています。
デフォルトの列は
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」をご参照ください。