Hologres V3.2 以降では、Data Lake Formation (DLF) を使用して Paimon カタログデータにアクセスできます。この機能により、統一されたインターフェイスが提供され、メタデータ管理の効率が向上します。
背景情報
Alibaba Cloud Data Lake Formation (DLF) は、統一されたメタデータ、データストレージ、およびデータ管理を提供するフルマネージドプラットフォームです。メタデータ管理、権限管理、ストレージ最適化などの機能を提供します。メタデータ、レイクテーブルフォーマット、データストレージを統一することで、DLF はデータレイクの構築と管理に伴う運用保守 (O&M) を簡素化します。これにより、企業はイノベーションとデータインサイトに集中できます。詳細については、「Data Lake Formation とは」をご参照ください。
特徴
Hologres
3.2以降では、以下の機能がサポートされています。外部データベースを使用して DLF 内の Paimon カタログに接続できます。詳細については、「EXTERNAL DATABASE」をご参照ください。
CREATE/DROP EXTERNAL SCHEMA を使用して、Paimon カタログ内のデータベースの作成または削除をカスケードできます。
CREATE/DROP EXTERNAL TABLE を使用して、Paimon カタログ内のテーブルの作成または削除をカスケードできます。
Paimon カタログ内のすべてのデータベースとテーブルを表示できます。
動的テーブルを使用して、Paimon テーブルから完全または増分的にデータを読み取ることができます。詳細については、「CREATE DYNAMIC TABLE」をご参照ください。
ANALYZE および AUTO ANALYZE を使用して、外部テーブルの統計情報を収集できます。これにより、オプティマイザーが最適なクエリプランを生成するのに役立ちます。詳細については、「ANALYZE と AUTO ANALYZE」をご参照ください。
外部テーブルからデータをミラーリングできます。
タイムトラベル:タイムスタンプ、バージョン、またはタグに基づいて Paimon テーブルの履歴スナップショットをクエリできます。
ブランチクエリ:ブランチに基づいて Paimon ブランチデータと履歴スナップショットをクエリできます。
Snapshots や Tags テーブルなど、Paimon システムテーブルをクエリできます。
Hologres
4.0以降では、以下の DML 操作がサポートされています。INSERT INTOまたはINSERT OVERWRITEを使用して、Paimon プライマリキーテーブルへの同時書き込みを実行できます。書き込みプロセスは、書き込み前にバケットによるシャッフルをサポートするように最適化されており、これにより小規模ファイルの生成が削減されます。キャッシュを必要とする Paimon テーブルへの書き込みをサポートするために、メモリベースのキャッシュ機構が提供されています。例としては、
First Rowマージエンジンを持つテーブル、lookupメカニズムを使用してChangelogを生成するテーブル、またはDeletion Vectorが有効になっているテーブルなどがあります。Paimon テーブルに対して
UPDATEおよびDELETE操作を使用できます。V3.2.6 および V4.0.6 以降、期限切れの Paimon スナップショットに対応するタグからデータを読み取ることができます。
前提条件
DLF V2.5 以降が有効化されており、Paimon カタログが作成されていること。詳細については、「DLF の権限付与と有効化」および「データカタログ」をご参照ください。
説明サポートされているリージョンについては、「サービスエンドポイント」をご参照ください。
Hologres インスタンスを購入し、データレイクアクセラレーションサービスを有効にしていること。詳細については、「DLF を使用した OSS データへのアクセス高速化」をご参照ください。
制限事項
Hologres インスタンスと同じリージョンにある DLF サービスにのみアクセスできます。
HoloWeb の OSS データレイクアクセラレーション機能を使用して、DLF Paimon カタログを視覚的に作成することはできません。
外部データベースを使用してマッピングされた Paimon 外部テーブルのみが、タイムトラベルクエリ、ブランチクエリ、およびデータミラーリングをサポートします。
スキーマ進化が発生したテーブルでは、タイムトラベルクエリはサポートされていません。
動的テーブルは、Paimon テーブルおよびブランチのタイムトラベルクエリをサポートしていません。
外部テーブルのデータミラーリングは、Paimon プライマリキーテーブルをサポートしていません。
Paimon テーブルのデフォルトパーティションからのデータ読み取りはサポートされていません。これには、空または NULL 値を持つパーティションが含まれます。
データレイクアクセラレーション機能は、読み取り専用セカンダリインスタンスでは有効にできません。
TRUNCATEコマンドは外部テーブルでは実行できません。代わりにINSERT OVERWRITEを使用して空のデータを挿入できます。bucketパラメーターを指定せずに作成されたテーブル、またはbucket = -1で作成されたテーブルである Paimon 動的バケットテーブルへのデータ書き込みはサポートされていません。UPDATE操作は、deduplicateまたはpartial-updateマージエンジンを持つ Paimon プライマリキーテーブルでのみサポートされます。プライマリキーの更新はサポートされていません。DELETE操作は、deduplicateマージエンジンを使用する Paimon プライマリキーテーブル、またはpartial-update.remove-record-on-deleteプロパティが有効になっているpartial-updateマージエンジンを使用するテーブルでのみサポートされます。外部テーブルは混合 DML トランザクションをサポートしていません。2フェーズコミットプロトコルは、分散書き込みの原子性を保証するために、単一の DML 操作内でのみ実装されます。
外部データベースを使用した Paimon カタログのマッピング
外部データベースの作成 (SLR モード)
サービスリンクロール (SLR) は、信頼できるエンティティが Alibaba Cloud サービスである RAM ロールです。SLR は、クロスサービスアクセスの権限付与問題を解決するために設計されています。ほとんどの場合、特定の機能を使用すると SLR が自動的に作成または削除されるため、手動で作成または削除する必要はありません。SLR は、Alibaba Cloud サービスが期待どおりに実行するために必要な権限を設定し、誤操作によるリスクを防ぐのに役立ちます。詳細については、「サービスリンクロール」をご参照ください。
利用シーン
SLR モードは、現在の ID を使用して外部データベースのデータにアクセスするシナリオに適しています。デフォルトでは、Hologres は SLR と ID パススルーを使用してクロスサービスアクセスを実装します。
手順
新規に購入したインスタンス、または Hologres V2.2 以降にアップグレードしたインスタンスの場合、システムは自動的に SLR を作成します。このステップはスキップできます。
説明Hologres V2.2 より前のインスタンスの場合は、アクセス制御のクイック承認ページに移動して SLR を作成してください。
Hologres インスタンスに接続し、外部データベースを作成します。
CREATE EXTERNAL DATABASE EXT_DATABASE_NAME WITH catalog_type 'paimon', metastore_type 'dlf-rest', dlf_catalog 'DLF_CATALOG_NAME', comment 'paimon catalog on dlf';外部データベース内のスキーマとテーブルを表示します。
-- 外部データベース内のスキーマをクエリします。 SELECT * FROM hologres.hg_external_schemas('<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>'</span>); -- スキーマ内のテーブルをクエリします。 SELECT * FROM hologres.hg_external_tables ('<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>'</span>, '<span class="var-span" contenteditable="true" data-var="EXT_SCHEMA_NAME"><ext_schema_name>'</span>);テーブルデータをクエリします。
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;
外部データベースの作成 (STS モード)
Alibaba Cloud Security Token Service (STS) は、一時的なアクセス権限を管理するサービスです。RAM は、RAM ユーザーと RAM ロールの 2 種類の ID を提供します。RAM ロールには永続的な ID 認証情報がありません。代わりに、STS から STS トークンと呼ばれる一時的な ID 認証情報を取得します。STS トークンの有効期間とアクセス権限はカスタマイズできます。詳細については、「STS とは」をご参照ください。
利用シーン
STS モードは、クロスアカウントアクセスまたは Hologres カスタムアカウント (BASIC アカウント) を使用して外部データベースのデータにアクセスするシナリオに適しています。
手順
RAM コンソールにログインし、RAM ロールを作成し、そのロールに AliyunDLFFullAccess または AliyunDLFReadOnlyAccess 権限を付与します。詳細については、「RAM ロールの作成と権限付与」をご参照ください。
信頼できる Alibaba Cloud サービスである Hologres が RAM ロールを偽装できるように、信頼ポリシーを追加します。詳細については、「RAM ロールの信頼ポリシーの変更」をご参照ください。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "hologres.aliyuncs.com" ] } } ], "Version": "1" }Data Lake Formation コンソールにログインします。宛先カタログで、RAM ロールにデータベースとテーブルへのアクセス権限を付与します。
Hologres で、外部データベースを作成し、認証ポリシーで前述の RAM ロールを指定します。
CREATE EXTERNAL DATABASE <ext_database_name> WITH catalog_type 'paimon' metastore_type 'dlf-rest' dlf_catalog 'paimon_catalog' rolearn 'acs:ram::106380604****:role/***-ramrole' comment 'paimon catalog on dlf' ;Hologres で、ユーザーマッピングを作成し、DLF カタログにアクセスする必要がある RAM ユーザーまたは BASIC アカウントを RAM ロールに関連付けます。
CREATE USER MAPPING FOR "<RAM user | basic account>" EXTERNAL DATABASE EXT_DATABASE_NAME OPTIONS ( rolearn 'acs:ram::10638060***:role/***ramrole' );説明ユーザーマッピングの詳細については、「CREATE USER MAPPING」をご参照ください。
RAM ユーザーの作成方法の詳細については、「RAM ユーザーの作成」をご参照ください。
BASIC アカウントの作成方法の詳細については、「ユーザー管理」をご参照ください。
RAM ユーザーとしてHologres 管理コンソールにログインするか、BASIC アカウントとしてHologres インスタンスに再接続します。その後、次の SQL クエリ文を実行します。
SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;
外部データベースに関連する操作については、「EXTERNAL DATABASE」をご参照ください。
外部スキーマに関連する操作については、「EXTERNAL SCHEMA」をご参照ください。
外部テーブルに関連する操作については、「EXTERNAL TABLE」をご参照ください。
外部テーブルの統計情報収集
ANALYZE および AUTO ANALYZE コマンドは、データベース内のテーブルの内容に関する統計情報を収集します。オプティマイザーはこれらの統計情報を使用して、最適なクエリプランを生成し、クエリ効率を向上させます。詳細については、「ANALYZE と AUTO ANALYZE」をご参照ください。
-- テーブルの統計情報を更新します。デフォルトでは、テーブル内のすべての列の統計情報が収集されます。
analyze <ext_database_name>.<ext_schema_name>.<ext_table_name>;
-- 特定の列の統計情報を更新します。テーブル全体の統計情報を更新する場合よりも多くのデータがサンプリングされるため、統計情報がより正確になります。これは主に条件付きの列を更新するために使用されます。
analyze <ext_database_name>.<ext_schema_name>.<ext_table_name>(<colname>, <colname>);
-- Auto Analyze を有効にします。
ALTER EXTERNAL DATABASE <ext_database_name> WITH enable_auto_analyze 'true';タイムトラベルクエリ
Hologres V3.2 以降では、タイムトラベルがサポートされています。タイムスタンプ、バージョン、またはタグに基づいて Paimon テーブルの履歴スナップショットをクエリできます。また、Hologres の Paimon Snapshots および Tags システムテーブルをクエリして、宛先テーブルのスナップショット詳細を取得することもできます。システムテーブルの詳細については、「Paimon システムテーブル」をご参照ください。
Paimon Snapshots システムテーブルのクエリ
SELECT * FROM hologres.hg_list_snapshots('EXT_DATABASE_NAME.<span class="var-span" contenteditable="true" data-var="EXT_SCHEMA_NAME">EXT_SCHEMA_NAME.EXT_TABLE_NAME'</span>);次の表に、Snapshots システムテーブルのフィールドと Paimon システムテーブルのフィールドのマッピングを示します。
Snapshots システムテーブルのフィールド | タイプ | 説明 | 対応する Paimon システムテーブルのフィールド |
branch_name | TEXT | ブランチ名。 | branch_name |
snapshot_id | TEXT | スナップショット ID。 | snapshot_id |
schema_id | TEXT | テーブルのスキーマ ID。 | schema_id |
commit_kind | TEXT | テーブルデータのコミットタイプ。 | commit_kind |
commit_time | TIMESTAMPTZ | コミット時間。 | commit_time |
extend_info | TEXT (JSON) | Paimon Snapshots システムテーブルの残りのプロパティ。 | Paimon Snapshots システムテーブルの残りのプロパティ |
また、hologres.hg_list_versions 関数を使用して Paimon Snapshots システムテーブルをクエリすることもできます。Paimon テーブルクエリの場合、バージョンはスナップショット ID に対応します。
SELECT * FROM hologres.hg_list_versions('EXT_DATABASE_NAME.<span class="var-span" contenteditable="true" data-var="EXT_SCHEMA_NAME">EXT_SCHEMA_NAME.EXT_TABLE_NAME'</span>);Paimon Tag システムテーブルのクエリ
SELECT * FROM hologres.hg_list_tags('<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>.<ext_schema_name>.<ext_table_name>'</span>);次の表に、Tag システムテーブルのフィールドと Paimon システムテーブルのフィールドのマッピングを示します。
Tag システムテーブルのフィールド | 型 | 説明 | 対応する Paimon システムテーブルのフィールド |
branch_name | TEXT | ブランチ名。 | branch_name |
tag_name | TEXT | タグ名。 | tag_name |
snapshot_id | TEXT | スナップショット ID。 | snapshot_id |
schema_id | TEXT | テーブルのスキーマ ID。 | schema_id |
commit_time | TIMESTAMPTZ | コミット時間。 | commit_time |
extend_info | TEXT (JSON) | Paimon Tag システムテーブルの残りのプロパティ。 | Paimon Tag システムテーブルの残りのプロパティ |
タイムスタンプに基づく履歴 Paimon スナップショットのクエリ
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME FOR TIMESTAMP AS OF 'TIMESTAMP';バージョンに基づく履歴 Paimon スナップショットのクエリ
Paimon テーブルでは、バージョンはスナップショット ID に対応します。
SELECT * FROM '<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>.<ext_schema_name>.<ext_table_name>'</span> FOR VERSION AS OF '<span class="var-span" contenteditable="true" data-var="VERSION"><version>'</span>;タグに基づく履歴 Paimon スナップショットのクエリ
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME FOR TAG AS OF 'TAG';ブランチクエリ
Hologres V3.2 以降では、Paimon テーブルの指定されたブランチからのデータクエリがサポートされており、ブランチフォールバックプロパティもサポートされています。Paimon ブランチの詳細については、「ブランチの管理」をご参照ください。
Branch システムテーブルのクエリ
SELECT * FROM hologres.hg_list_branches('<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>.<ext_schema_name>.<ext_table_name>'</span>);次の表に、Branch システムテーブルのフィールドと Paimon システムテーブルのフィールドのマッピングを示します。
フィールド | タイプ | 説明 | 対応する Paimon システムテーブルのフィールド |
branch_name | TEXT | ブランチ名。 | branch_name |
create_time | TIMESTAMPTZ | ブランチが作成された時間。 | create_time |
extend_info | TEXT (JSON) | Paimon Branch システムテーブルの残りのプロパティ。 | Paimon Branch システムテーブルの残りのプロパティ |
指定されたブランチからのデータクエリ
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME FOR branch AS OF 'TAG';Paimon テーブルに scan.fallback-branch プロパティが設定されていて、クエリタスクが現在のブランチからデータを読み取る際にパーティションが存在しない場合、リーダーはフォールバックブランチからパーティションデータを読み取ろうとします。フォールバックブランチの詳細については、「ブランチの管理」をご参照ください。
指定されたブランチからの履歴スナップショットデータのクエリ
-- タイムスタンプに基づくクエリ。
SELECT * FROM '<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>.<ext_schema_name>.<ext_table_name>'</span> FOR branch AS OF '<span class="var-span" contenteditable="true" data-var="BRANCH_NAME"><branch_name>'</span> TIMESTAMP AS OF '<span class="var-span" contenteditable="true" data-var="TIMESTAMP"><timestamp>'</span>;
-- タグに基づくクエリ。
SELECT * FROM '<span class="var-span" contenteditable="true" data-var="EXT_DATABASE_NAME"><ext_database_name>.<ext_schema_name>.<ext_table_name>'</span> FOR branch AS OF '<span class="var-span" contenteditable="true" data-var="BRANCH_NAME"><branch_name>'</span> TAG AS OF '<span class="var-span" contenteditable="true" data-var="TAG_NAME"><tag_name>'</span>;Lakehouse テーブルイメージアクセラレーション
Hologres V3.2 以降では、データレイクテーブルミラーリング機能を提供し、データレイク内のデータのクエリを高速化します。この機能はメタデータとデータのミラーリングをサポートし、外部データソースからの変更をほぼリアルタイムまたは指定された間隔で Hologres に同期できます。また、完全なテーブルミラーリングとパーティションテーブルの部分的なミラーリングもサポートしています。パラメーターを使用して、ミラーリングされたデータの範囲を柔軟に制御できます。詳細については、「データレイクテーブルミラーリング」をご参照ください。
外部テーブルを使用した Paimon テーブルへのアクセス
外部サーバーを作成します。
外部サーバーに関する操作の詳細については、「外部サーバーに関するその他の操作 (SQL)」をご参照ください。
DLF 構文
説明DLF V2.5 以降に適用されます。
SQL 構文は次のとおりです。
-- 外部サーバーの作成 CREATE SERVER IF NOT EXISTS SERVER_NAME FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( catalog_type 'paimon', metastore_type 'dlf-rest', dlf_catalog 'DLF_CATALOG_NAME' );DLF 1.0 構文
説明DLF V1.0 に適用されます。
SQL 構文は次のとおりです。
-- 外部サーバーの作成 CREATE SERVER IF NOT EXISTS SERVER_NAME FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( dlf_region '', dlf_endpoint 'dlf-share..aliyuncs.com', oss_endpoint 'oss-REGION_ID-internal.aliyuncs.com', dlf_catalog 'dlf_catalog_name' );外部テーブルを作成します。
IMPORT FOREIGN SCHEMA の使用
IMPORT FOREIGN SCHEMA の使用方法の詳細については、「IMPORT FOREIGN SCHEMA」をご参照ください。
IMPORT FOREIGN SCHEMA を使用して外部テーブルを作成する
-- IMPORT FOREIGN SCHEMA を使用して外部テーブルを作成します。 IMPORT FOREIGN SCHEMA <dlf_db_name> FROM SERVER <server_name> INTO <holo_schema_name> options (if_table_exist 'update');テーブル名を指定して外部テーブルを作成する
IMPORT FOREIGN SCHEMA <dlf_db_name> limit to (table_name[,....]) FROM SERVER <server_name> into <holo_schema_name> options (if_table_exist 'update');
CREATE FOREIGN TABLE 文
CREATE FOREIGN TABLE の使用方法の詳細については、「CREATE FOREIGN TABLE」をご参照ください。
CREATE FOREIGN TABLE FOREIGN_TABLE_NAME ( column_name data_type [, ... ] ) SERVER SERVER_NAME options ( schema_name 'DLF_DB_NAME', table_name 'DLF_TABLE_NAME' );
動的テーブルを使用した Paimon テーブルへのアクセス
動的テーブルは、1つまたは複数のベーステーブルのデータ集約結果を自動的に処理および保存できます。組み込みのデータリフレッシュポリシーを備えています。必要に応じて異なるデータリフレッシュポリシーを設定し、ベーステーブルから動的テーブルへの自動的なデータフローを実現できます。これにより、統一された開発、自動的なデータフロー、および処理の適時性に関するビジネス要件を満たします。Hologres V3.0 以降では、MaxCompute 外部テーブルと DLF 外部テーブルを動的テーブルのベーステーブルとして使用できます。詳細については、「動的テーブル」をご参照ください。
フルリフレッシュ
CREATE DYNAMIC TABLE paimon_dt_table
WITH (
auto_refresh_mode='full',
freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;増分リフレッシュ
CREATE DYNAMIC TABLE paimon_dt_table_increamental
WITH (
auto_refresh_mode='incremental',
freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;自動リフレッシュ
CREATE DYNAMIC TABLE paimon_dt_table_auto
WITH (
auto_refresh_mode='auto',
freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;DML 操作
INSERT INTO
-- Hologres SQL を使用して Paimon プライマリキーテーブルを作成し、データを挿入します。
CREATE EXTERNAL TABLE <ext_database_name>.<ext_schema_name>.<ext_table_name> (
id BIGINT,
customer_id BIGINT,
item TEXT,
amount FLOAT,
dt TEXT,
PRIMARY KEY (id)
)
WITH (
"table_format" = 'paimon',
"file_format" = 'orc',
"merge-engine" = 'deduplicate', -- マージエンジンの例。必要に応じて変更してください。
"bucket" = '4' -- バケット数の例。
);
INSERT INTO <ext_database_name>.<ext_schema_name>.<ext_table_name> (id, customer_id, item, amount, dt) VALUES
(1, 1001, 'apple', 3.50, '2025-09-10'),
(2, 1002, 'banana', 2.00, '2025-09-10'),
(3, 1003, 'orange', 4.20, '2025-09-11');INSERT OVERWRITE
-- Hologres SQL を使用して Paimon 追加専用テーブルを作成し、データを挿入します。
CREATE EXTERNAL TABLE <ext_database_name>.<ext_schema_name>.<ext_table_name> (
id BIGINT,
name TEXT,
amount FLOAT8,
dt TEXT
)
LOGICAL PARTITION BY LIST(dt)
WITH (
"table_format" = 'paimon',
"file_format" = 'parquet',
"merge-engine" = 'deduplicate',
"bucket-key" = 'id',
"bucket" = '2'
);
INSERT OVERWRITE <ext_database_name>.<ext_schema_name>.<ext_table_name>(id, name, amount, dt) VALUES
(1, 'Alice', 100.50, '2025-09-01'),
(2, 'Bob', 200.00, '2025-09-01'),
(3, 'Carol', 150.75, '2025-09-02');UPDATE
UPDATE <ext_database_name>.<ext_schema_name>.<ext_table_name> SET amount= 5 where id= 1;DELETE
DELETE FROM <ext_database_name>.<ext_schema_name>.<ext_table_name> WHERE id = 2;