このトピックでは、Spark SQL を使用して AnalyticDB for MySQL で Iceberg 外部テーブルを読み書きする方法について説明します。
前提条件
AnalyticDB for MySQL Enterprise Edition、Basic Edition、または Data Lakehouse Edition クラスタが作成されている。
Enterprise Edition または Basic Edition クラスタで予約されているリソースの量が 0 AnalyticDB 計算ユニット(ACU)を超えている。
Data Lakehouse Edition クラスタで予約されているストレージリソースの量が 0 ACU を超えている。
クラスタのカーネルバージョンが 3.2.5.0 以降である。
説明AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
AnalyticDB for MySQL クラスタ用に Spark エンジンを搭載したジョブリソースグループまたはインタラクティブリソースグループが作成されている。
AnalyticDB for MySQL クラスタ用にデータベースアカウントが作成されている。
Alibaba Cloud アカウントを使用する場合は、特権アカウントを作成するだけで済みます。
Resource Access Management(RAM)ユーザーを使用する場合は、特権アカウントと標準アカウントを作成し、標準アカウントを RAM ユーザーに関連付ける必要があります。
AnalyticDB for MySQL クラスタと同じリージョンに Object Storage Service (OSS) バケットが作成されている。
Data Lake Storage がアクティブ化されている。
説明この条件は、Data Lake Storage テーブルを読み書きする場合にのみ必要です。
手順 1: SQL 開発ページに移動する
AnalyticDB for MySQL コンソール にログインします。コンソールの左上隅で、リージョンを選択します。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。管理するクラスタを見つけ、クラスタ ID をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
[SQLConsole] タブで、Spark エンジンとリソースグループ(ジョブリソースグループまたは Spark エンジンを搭載したインタラクティブリソースグループ)を選択します。
手順 2: 外部データベースと Iceberg 外部テーブルを作成する
次の SQL 文は、バッチモードまたはインタラクティブモードで実行できます。
Data Lake Storage テーブル
データベースを作成します。
CREATE DATABASE adb_external_db_iceberg WITH DBPROPERTIES ('adb_lake_bucket' = 'adb-lake-cn-shanghai-6gml****');次の表にパラメータを示します。
パラメータ
説明
adb_lake_bucket
Data Lake Storage テーブルデータのストレージ場所を指定します。
データベースの作成ステートメントで Data Lake Storage を指定すると、データベース内のすべてのテーブルが Data Lake Storage に格納されます。データベース内のすべてのテーブルを Data Lake Storage に格納したくない場合は、テーブルの作成時にこのパラメータを設定できます。
Iceberg 外部テーブルを作成します。
SET spark.adb.lakehouse.enabled=true; -- Data Lake Storage を有効にする CREATE TABLE adb_external_db_iceberg.test_iceberg_tbl ( `id` int, `name` string, `age` int ) USING iceberg PARTITIONED BY (age) TBLPROPERTIES ( 'adb_lake_bucket' = 'adb-lake-cn-shanghai-6gml****' );次の表にパラメータを示します。
パラメータ
説明
adb_lake_bucket
Data Lake Storage テーブルデータのストレージ場所を指定します。
データベースの作成時に Data Lake Storage を指定した場合、データベース内のすべてのテーブルは Data Lake Storage に格納されます。テーブルの作成時にこのパラメータを再度指定する必要はありません。
データベースの作成時に Data Lake Storage を指定しなかった場合、テーブルの作成時にこのパラメータを明示的に指定する必要があります。指定しないと、エラーが発生します。このパラメータを指定すると、テーブルのデータは指定された Data Lake Storage に格納されます。
データベースとテーブルの両方を作成するときに Data Lake Storage を明示的に指定した場合、テーブルのデータは、テーブルの作成時に指定された Data Lake Storage に格納されます。データベース内の他のテーブルは、データベースの作成時に指定された Data Lake Storage に格納されます。
Data Lake Storage 以外のテーブル
既存のデータベースに Iceberg 外部テーブルを作成できるかどうかを確認するか、新しいデータベースを作成します。
SHOW CREATE DATABASE文を実行して、既存のデータベースの DDL 文を表示します。次のいずれかの条件が満たされている場合は、既存のデータベースを使用できます。そうでない場合は、新しいデータベースを作成する必要があります。DDL 文に
Locationパラメータが指定されていない。DDL 文に
Locationパラメータが指定されており、Catalogパラメータの値がmixである。
新しいデータベースを作成します。
CREATE DATABASE adb_external_db_iceberg;
Iceberg 外部テーブルを作成します。
重要データベースに
Locationパラメータが指定されている場合は、Iceberg 外部テーブルの作成、読み取り、書き込みに使用するspark.iceberg.warehouseパラメータで指定された OSS パスプレフィックスがLocationパラメータと一致していることを確認する必要があります。SET spark.adb.version=3.5; -- Spark バージョンを指定します。3.5 である必要があります。 SET spark.iceberg.warehouse=oss://testBucketName/iceberg/; -- Iceberg 外部テーブルのメタデータとデータファイルのストレージパス CREATE TABLE adb_external_db_iceberg.test_iceberg_tbl ( `id` int, `name` string, `age` int ) USING iceberg PARTITIONED BY (age);
手順 3: Iceberg 外部テーブルにデータを書き込むか、Iceberg 外部テーブルからデータを削除する
Data Lake Storage テーブル
データの書き込み
書き込み操作を実行する場合は、SQL 文の前に次のパラメータを追加する必要があります。追加しないと、書き込み操作は失敗します。
SET spark.adb.lakehouse.enabled=true; -- Data Lake Storage を有効にするINSERT INTO 文を実行してデータを書き込みます。
INSERT INTO adb_external_db_iceberg.test_iceberg_tbl VALUES (1, 'lisa', 10), (2, 'jams', 20);INSERT OVERWRITE 文を実行してデータを書き込みます。
INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl VALUES (1, 'lisa', 10), (2, 'jams', 30);INSERT OVERWRITE 文を実行してデータを静的パーティションに書き込みます。
INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl PARTITION(age=10) VALUES (1, 'anna');INSERT OVERWRITE 文を実行してデータを動的パーティションに書き込みます。
SET spark.sql.sources.partitionOverwriteMode=dynamic; -- 動的パーティションのみを上書きします。構成されていない場合、テーブル内のすべてのデータが上書きされます。 INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl PARTITION(age) VALUES (1, 'bom', 10);UPDATE 文を実行してデータを書き込みます。
UPDATE adb_external_db_iceberg.test_iceberg_tbl SET name = 'box' WHERE id = 2;
データの削除
SET spark.adb.lakehouse.enabled=true; -- Data Lake Storage を有効にする
DELETE FROM adb_external_db_iceberg.test_iceberg_tbl WHERE id = 1;
DELETE FROM adb_external_db_iceberg.test_iceberg_tbl WHERE age = 20;Data Lake Storage 以外のテーブル
書き込み操作と削除操作を実行する場合は、SQL 文の前に次のパラメータを追加する必要があります。追加しないと、書き込み操作と削除操作は失敗します。
SET spark.adb.version=3.5; -- Spark バージョンを指定します。3.5 である必要があります。
SET spark.iceberg.warehouse=oss://testBucketName/iceberg/; -- Iceberg 外部テーブルのメタデータとデータファイルのストレージパスデータの書き込み
INSERT INTO 文を実行してデータを書き込みます。
INSERT INTO adb_external_db_iceberg.test_iceberg_tbl VALUES (1, 'Frank', 10), (2, 'Amy', 10);INSERT OVERWRITE 文を実行してデータを書き込みます。
INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl VALUES (1, 'Frank', 10), (2, 'Amy', 20);INSERT OVERWRITE 静的パーティション書き込み
INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl PARTITION(age=10) VALUES (1, 'Frank');INSERT OVERWRITE 文を実行してデータを動的パーティションに書き込みます。
SET spark.sql.sources.partitionOverwriteMode=dynamic; -- 動的パーティションのみを上書きします。構成されていない場合、テーブル内のすべてのデータが上書きされます INSERT OVERWRITE adb_external_db_iceberg.test_iceberg_tbl PARTITION(age) VALUES (1, 'Bom', 10);UPDATE 文を実行してデータを書き込みます。
UPDATE adb_external_db_iceberg.test_iceberg_tbl SET name = 'box' WHERE id = 2;
データの削除
SET spark.adb.version=3.5; -- Spark バージョンを指定します。3.5 である必要があります
SET spark.iceberg.warehouse=oss://testBucketName/iceberg/; -- Iceberg 外部テーブルのメタデータとデータファイルのストレージパス
DELETE FROM adb_external_db_iceberg.test_iceberg_tbl WHERE id = 1;
DELETE FROM adb_external_db_iceberg.test_iceberg_tbl WHERE age = 20;手順 4: Iceberg 外部テーブルからデータをクエリする
Data Lake Storage テーブル
SET spark.adb.lakehouse.enabled=true; -- Data Lake Storage を有効にする
SELECT * FROM adb_external_db_iceberg.test_iceberg_tbl;戻り値:
+---+----+---+
|id |name|age|
+---+----+---+
|1 |anna|10 |
|2 |jams|20 |
+---+----+---+Data Lake Storage 以外のテーブル
SET spark.adb.version=3.5; -- Spark バージョンを指定します。3.5 である必要があります
SET spark.iceberg.warehouse=oss://testBucketName/iceberg/; -- Iceberg 外部テーブルのメタデータとデータファイルのストレージパス
SELECT * FROM adb_external_db_iceberg.test_iceberg_tbl;戻り値:
+---+----+---+
|id |name|age|
+---+----+---+
|1 |anna|10 |
|2 |jams|20 |
+---+----+---+手順 5: Iceberg 外部テーブルを削除する
Data Lake Storage テーブル
Iceberg で管理されている Data Lake Storage テーブルのメタデータとデータを AnalyticDB for MySQL から削除します。
SET spark.adb.lakehouse.enabled=true;
DROP TABLE adb_external_db_iceberg.test_iceberg_tbl;Data Lake Storage 以外のテーブル
OSS の Iceberg 外部テーブルデータを保持しながら、AnalyticDB for MySQL から Iceberg 外部テーブルを削除します。
DROP TABLE adb_external_db_iceberg.test_iceberg_tbl;AnalyticDB for MySQL から Iceberg 外部テーブルを削除し、OSS から Iceberg 外部テーブルデータを削除します。
DROP TABLE adb_external_db_iceberg.test_iceberg_tbl purge;