MaxCompute で Paimon 外部テーブルを作成して、Object Storage Service (OSS) の Paimon テーブルフォルダーにマッピングし、これらのフォルダー内のデータにアクセスできます。このトピックでは、Paimon 外部テーブルを作成し、MaxCompute を使用してそのデータにアクセスする方法について説明します。
機能紹介
Apache Paimon は、ストリーミング処理とバッチ処理の両方をサポートするデータレイクストレージフォーマットです。高スループットの書き込みと低レイテンシーのクエリを提供します。Paimon は、Realtime Compute for Apache Flink や E-MapReduce などのサービスで利用可能な Spark、Hive、Trino などの一般的なコンピュートエンジンと完全に統合されています。Apache Paimon を使用して、OSS 上にデータレイクを迅速に構築し、それを MaxCompute に接続してデータレイク分析を行うことができます。メタデータフィルタリング機能は、タスク処理中に不要な OSS フォルダーから読み取られるファイル数を減らすことで、クエリパフォーマンスをさらに最適化します。
適用範囲
Paimon 外部テーブルのスキーマは、Paimon ファイルのスキーマ変更を反映して自動的に更新されません。
Paimon 外部テーブルにクラスタープロパティやプライマリキーを設定することはできません。
Paimon 外部テーブルは、履歴データバージョンのクエリなどの機能をサポートしていません。
Paimon 外部テーブルに直接データを書き込まないでください。代わりに、UNLOAD などのメソッドを使用してデータを OSS にエクスポートします。
INSERT INTO または INSERT OVERWRITE 文を使用して、Paimon 外部テーブルにデータを書き込むことができます。動的バケットテーブルまたはクロスパーティションテーブルへのデータ書き込みはサポートされていません。
Paimon 外部テーブルでは、UPDATE および DELETE 操作はサポートされていません。
MaxCompute と OSS は同じリージョンにある必要があります。
サポートされるデータ型
MaxCompute のデータ型の詳細については、「データ型 (バージョン 1.0)」および「データ型 (バージョン 2.0)」をご参照ください。
オープンソース Paimon データ型 | MaxCompute V2.0 データ型 | 読み取り/書き込みサポート | 説明 |
TINYINT | TINYINT |
| 8 ビット符号付き整数。 |
SMALLINT | SMALLINT |
| 16 ビット符号付き整数。 |
INT | INT |
| 32 ビット符号付き整数。 |
BIGINT | BIGINT |
| 64 ビット符号付き整数。 |
BINARY(MAX_LENGTH) | BINARY |
| バイナリデータ型。最大長は 8 MB です。 |
FLOAT | FLOAT |
| 32 ビット 2 進浮動小数点数。 |
DOUBLE | DOUBLE |
| 64 ビット 2 進浮動小数点数。 |
DECIMAL(precision,scale) | DECIMAL(precision,scale) |
| 高精度 10 進数。デフォルトは
|
VARCHAR(n) | VARCHAR(n) |
| 可変長文字列型。n は長さを表し、1 から 65,535 の範囲です。 |
CHAR(n) | CHAR(n) |
| 固定長文字列型。n は長さを表し、1 から 255 の範囲です。 |
VARCHAR(MAX_LENGTH) | STRING |
| 文字列型。最大長は 8 MB です。 |
DATE | DATE |
| 日付型。フォーマットは |
TIME, TIME(p) | サポートされていません |
| Paimon の TIME データ型は、タイムゾーンのない時間型です。時、分、秒で構成され、精度はナノ秒までです。 TIME(p) は小数部の精度を示し、0 から 9 までの整数を指定できます。デフォルト値は 0 です。 MaxCompute には対応する型がありません。 |
TIMESTAMP, TIMESTAMP(p) | TIMESTAMP_NTZ |
| タイムゾーンのないタイムスタンプ型で、精度はナノ秒までです。 テーブルを読み取るには、ネイティブスイッチを有効にします: |
TIMESTAMP WITH LOCAL TIME_ZONE(9) | TIMESTAMP |
|
|
TIMESTAMP WITH LOCAL TIME_ZONE(9) | DATETIME |
| 精度がナノ秒までのタイムスタンプ型。 フォーマットは |
BOOLEAN | BOOLEAN |
| BOOLEAN 型。 |
ARRAY | ARRAY |
| 複合型。 |
MAP | MAP |
| 複合型。 |
ROW | STRUCT |
| 複合型。 |
MULTISET<t> | サポートされていません |
| MaxCompute には対応する型がありません。 |
VARBINARY, VARBINARY(n), BYTES | BINARY |
| 可変長バイナリ文字列データ型。 |
Paimon 外部テーブルの作成
構文
異なるフォーマットの外部テーブルの構文の詳細については、「OSS 外部テーブル」をご参照ください。
CREATE EXTERNAL TABLE [if NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION '<oss_location>';共通パラメーター
共通パラメーターの詳細については、「基本構文パラメーター」をご参照ください。
データの書き込み
MaxCompute の書き込み構文の詳細については、「書き込み構文」をご参照ください。
クエリと分析
SELECT 構文の詳細については、「クエリ構文」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
BadRowSkipping の詳細については、「BadRowSkipping」をご参照ください。
例
ステップ 1:前提条件
MaxCompute プロジェクトを作成済みであること。
OSS バケットとフォルダーを準備します。詳細については、「バケットの作成」および「フォルダーの管理」をご参照ください。
MaxCompute は一部のリージョンにのみデプロイされています。データの接続性の問題を避けるため、ご利用の MaxCompute プロジェクトと同じリージョンにある OSS バケットを使用してください。
権限付与
OSS にアクセスするための権限が必要です。Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールを使用して OSS 外部テーブルにアクセスできます。権限付与の詳細については、「OSS の STS 権限付与」をご参照ください。
MaxCompute プロジェクトで `CreateTable` 権限が必要です。テーブル操作の権限の詳細については、「MaxCompute の権限」をご参照ください。
ステップ 2:Flink でのデータ準備
Paimon カタログと Paimon テーブルを作成し、そのテーブルにデータを挿入します。以下に例を示します。
OSS に Paimon テーブルデータが既にある場合は、このステップをスキップできます。
Paimon ファイルシステムカタログの作成
Flink コンソールにログインし、左上隅でリージョンを選択します。
目的のワークスペースをクリックします。 左側のナビゲーションウィンドウで、[カタログ] を選択します。
[カタログリスト] ページで、右側の [カタログの作成] をクリックします。[カタログの作成] ダイアログボックスで、Apache Paimon を選択し、[次へ] をクリックして、次のパラメーターを設定します:
パラメーター
必須
説明
metastore
必須
メタストアのタイプ。この例では、
filesystemを選択します。catalog name
必須
カスタムのカタログ名。例:
paimon-catalog。warehouse
必須
OSS で指定されたデータウェアハウスディレクトリ。例:
oss://paimon-fs/paimon-test/。fs.oss.endpoint
必須
OSS サービスのエンドポイント。たとえば、中国 (杭州) リージョンのエンドポイントは
oss-cn-hangzhou-internal.aliyuncs.comです。fs.oss.accessKeyId
必須
OSS サービスへのアクセスに必要な AccessKey ID。
fs.oss.accessKeySecret
必須
OSS サービスへのアクセスに必要な AccessKey Secret。
Paimon テーブルの作成
Flink コンソールにログインし、左上隅でリージョンを選択します。
対象のワークスペース名をクリックし、左側のナビゲーションウィンドウで を選択します。
[新規スクリプト] タブでは、
をクリックして新しいクエリスクリプトを作成できます。次のコマンドを入力し、[実行] をクリックします。
CREATE TABLE `paimon-catalog`.`default`.test_tbl ( id BIGINT, data STRING, dt STRING, PRIMARY KEY (dt, id) NOT ENFORCED ) PARTITIONED BY (dt); INSERT INTO `paimon-catalog`.`default`.test_tbl VALUES (1,'CCC','2024-07-18'), (2,'DDD','2024-07-18');
SQL ジョブが有界ストリームジョブである場合 (例:
INSERT INTO ... VALUES ...文を実行するジョブ)、次の手順を実行します:対象のワークスペース名をクリックします。左側のナビゲーションウィンドウで、を選択します。
[デプロイメント] ページで、対象のジョブの名前をクリックすると、その[設定] ページが開きます。
ジョブの実行時パラメーターを設定する方法の詳細については、「ジョブデプロイメント情報の設定」をご参照ください。
ステップ 3:MaxCompute での Paimon 外部テーブルの作成
MaxCompute で、次の SQL 文を実行して MaxCompute Paimon 外部テーブルを作成します。
CREATE EXTERNAL TABLE oss_extable_paimon_pt
(
id BIGINT,
data STRING
)
PARTITIONED BY (dt STRING )
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION 'oss://oss-cn-<your-region>-internal.aliyuncs.com/<table_path>'
;上記の文で、table_path は Flink の Paimon テーブルへのパスです。例:paimon-fs/paimon-test/default.db/test_tbl。パスを取得するには、次の手順を実行します:
Flink コンソールにログインし、左上隅でリージョンを選択します。
対象のワークスペースの名前をクリックします。左側のナビゲーションウィンドウで、[カタログ] を選択します。
ステップ 4:パーティションデータのインポート
作成した OSS 外部テーブルがパーティションテーブルである場合は、パーティションデータもインポートする必要があります。詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。
MSCK REPAIR TABLE oss_extable_paimon_pt ADD PARTITIONS;ステップ 5:MaxCompute を使用した Paimon 外部テーブルの読み取り
MaxCompute で、次の文を実行して MaxCompute Paimon 外部テーブル `oss_extable_paimon_pt` をクエリします。
SET odps.sql.common.table.planner.ext.hive.bridge = true;
SET odps.sql.hive.compatible = true;
SELECT * FROM oss_extable_paimon_pt WHERE dt='2024-07-18';次の結果が返されます:
+------------+------------+------------+
| id | data | dt |
+------------+------------+------------+
| 1 | CCC | 2024-07-18 |
| 2 | DDD | 2024-07-18 |
+------------+------------+------------+Paimon ファイルのスキーマが外部テーブルのスキーマと一致しない場合:
列数の不一致: Paimon ファイルの列数が外部テーブルのスキーマより少ない場合、データの読み取り時に不足している列は NULL 値で埋められます。Paimon ファイルの列数が多い場合、余分な列データは破棄されます。
列の型の不一致: MaxCompute では、`INT` 型を使用して Paimon ファイルから `STRING` データを読み取ることはできません。`STRING` 型を使用して `INT` データを読み取ることはできますが、この方法は推奨されません。
よくある質問
Paimon 外部テーブルからデータを読み取る際に kSIGABRT エラーが発生するのはなぜですか?
エラーメッセージ:
ODPS-0123144: Fuxi job failed - kSIGABRT(errCode:6) at Odps/*****_SQL_0_1_0_job_0/M1@f01b17437.cloud.eo166#3. Detail error msg: CRASH_CORE, maybe caused by jvm crash, please check your java udf/udaf/udtf. | fatalInstance: Odps/*****_SQL_0_1_0_job_0/M1#0_0原因:
このエラーは、Java Native Interface (JNI) モードを使用して TIMESTAMP_NTZ 型のデータを読み取る場合に発生します。
解決策:
テーブルからデータを読み取る前に、次の文を実行してネイティブスイッチを有効にします:
SET odps.sql.common.table.jni.disable.native=true;。
関連ドキュメント
カスタムカタログを使用して、Flink で MaxCompute Paimon 外部テーブルを作成できます。データがテーブルに書き込まれた後、MaxCompute を使用して Paimon データをクエリおよび消費できます。詳細については、「Flink を使用した MaxCompute Paimon 外部テーブルの作成」をご参照ください。