Writing to object storage#
PostgresアナリティクスアクセラレータPGAAは、 CREATE TABLE AS SELECT
CTAS構文を使用したデータレイクへの直接書き込みをサポートしています。これにより、ローカルのPostgresテーブルの変換、既存のオブジェクトストレージファイルの再構築、または両方のデータを結合するかにかかわらず、任意のソースからのデータをIcebergやDelta
Lakeのような高性能のカラムナー形式に処理および永続化できます。
PGAAはPostgresクエリエグゼキューターと統合されているため、CTASオペレーションのソースデータは、インスタンスにアクセスできる任意の場所に存在できます。これにより、いくつかの高度なワークフローが有効になります。
エクスポート 標準のローカルPostgresテーブルからデータレイクにデータを移動して、履歴データをアーカイブします。
変換 1つのオブジェクト格納場所から読み取り、結合または集計を実行し、結果を別のクラウドディレクトリに書き込みます。
フェデレーションジョイン ローカルリレーショナルテーブルをリモートオブジェクトストレージテーブルと結合し、結合された結果をクラウドに書き込みます。
PGAA
アクセス方法を使用することにより、クエリの結果セットを指定したストレージ場所に直接ストリーミングできます。AWS
S3およびS3互換API、Google Cloud Storage GCS、Azure Blob Storage ADLS
Gen2、およびローカルファイルシステム、または統合されたIcebergカタログに直接。
スタンドアロンのストレージ場所または統合されたIcebergカタログを使用して、CTAS操作を実行できます。
注釈
CTASは、不変のライトワンス操作用に設計されています。オブジェクトストレージでの継続的な`INSERT` 、UPDATE 、または`DELETE` 操作など、より高度な書き込み機能については、 PGD integration を参照してください。
スタンドアロンの保存場所を使用する#
この方法は、1回限りのエクスポートまたはアドホックデータの移動に最適です。 PGAAは、Postgres行からターゲット形式への変換を処理し、必要なメタデータまたはトランザクションログIcebergマニフェストまたはDeltaトランザクションログなどを生成し、単一のアトミック操作で結果をコミットします。
CTASを介してオブジェクトストレージにテーブルをプロビジョニングするには、2段階のプロセスが必要です。最初に、ストレージの場所を介してリモートストレージ環境への物理接続を確立し、次にクエリ結果をその場所にマッピングするSQLコマンドを実行します。
保存場所の作成#
オブジェクトストレージに書き込むには、 create a PGFS storage location を行う必要があります。これにより、ターゲットバケットが定義され、必要な資格情報が提供されます。例
SELECT pgfs.create_storage_location(
my_lake_data,
s3://your-bucket-name/path,
{"aws_region": "us-east-1", "aws_access_key_id": "...", "aws_secret_access_key": "..."}
);
注釈
保存場所に関連付けられた資格情報には、宛先バケットの読み取りおよび書き込み権限が必要です。これは、次のファンクションを実行して確認できます。成功した場合は`NULL` を結果ます。
SELECT pgaa.test_storage_location (my_lake_data, true);
CTASを使用したテーブルの作成#
USING PGAA WITH およびAS
句を使用して、結果セットをオブジェクトストレージの構造化テーブルフォーマットに直接エクスポートするテーブルを作成します。例
CREATE TABLE s3_export_table
USING PGAA
WITH (
pgaa.storage_location = my_lake_data,
pgaa.path = path/in/s3/iceberg_data,
pgaa.format = iceberg
) AS
SELECT * FROM local_source_table;
そこで
pgaa.format宛先テーブルフォーマットを指定します。サポートされている値はicebergおよびdeltaです。pgaa.storage_location前の手順で定義した保存場所の名前。pgaa.path宛先ディレクトリ。 PGAAは、このパス内にメタデータとログディレクトリを自動的に作成します。
Icebergカタログを使用する#
Icebergカタログを統合している場合は、CTASを使用してそれに書き込むことができます。このモードでは、カタログはストレージパスとテーブルのバージョン管理を自動的に管理します。
CTASを介してオブジェクトストレージのテーブルに書き込み、Icebergカタログを使用するには、2つのステップで構成されます。最初にカタログ接続を構成し、次にそのカタログを介してクエリ結果をマップするSQLコマンドを実行します。
カタログ接続の構成#
ファンクション pgaa.add_catalog()
を使用して、外部IcebergカタログをPostgresインスタンスに登録します。例
SELECT pgaa.add_catalog(
my_iceberg_catalog,
iceberg-rest,
{
"url": "https://your-catalog-endpoint.com",
"warehouse_name": "your_warehouse_name",
"warehouse": "your_warehouse_id",
"token": "your_secret_auth_token"
"danger_accept_invalid_certs": "false"
}
);
構成オプションの完全なリストについては、 カタログ接続の追加 を参照してください。
注釈
カタログへの書き込み権限が必要です。これは、次のファンクションを実行して確認できます。成功した場合は`NULL` を結果ます。
SELECT pgaa.test_catalog(my_iceberg_catalog, test_writes := TRUE);
カタログ管理CTASテーブルの作成#
USING PGAA WITH およびAS
句を使用して、結果セットを構成済みのIcebergカタログに直接エクスポートするテーブルを作成します。例
CREATE TABLE export_local_transactions
USING PGAA
WITH (
pgaa.format = iceberg,
pgaa.managed_by = my_iceberg_catalog,
pgaa.catalog_namespace = public,
pgaa.catalog_table = managed_sales_data
) AS
SELECT * FROM local_transactions;
そこで
pgaa.format宛先テーブルフォーマットを設定します。現在、’iceberg’のみがサポートされています。pgaa.managed_byカタログ名を指定します。pgaa.catalog_namespaceIcebergカタログ内でテーブルが配置される名前空間またはデータベースを定義します。pgaa.catalog_tableデータレイクに作成するテーブルの名前を設定します。
CTASの進行状況のモニタリング#
大規模なCTAS操作の場合、PGAAはNOTICE
メッセージを発行して、システムビューをポーリングしたりログを照会したりせずに進行状況を追跡できます。進行状況は100万行ごとまたは10分ごとのいずれか早い方で報告され、その後に最終的な完了メッセージが続きます。
NOTICE: CTAS progress: 1000000 rows processed
NOTICE: CTAS progress: 2000000 rows processed
NOTICE: CTAS completed: 2500000 rows processed
CTASの制限#
CTASはデータの移動と変換のための強力なツールですが、次の制約のある特定の実行モデルで動作します。
エンジンの依存関係 CTAS操作を実行する場合、ソース内部クエリはDirectScanを利用しません。代わりに、データの取得は、CompatScanを介して標準のPostgresエンジンによって処理されます。したがって、
SELECTフェーズ内の複雑な結合または集計は、Seafowlエンジンが提供する完全なベクトル化加速の恩恵を受けられません。自動上書きなし 偶発的なデータの損失を防ぐため、スタンドアロンの保存場所を使用する場合、指定された
pgaa.pathにデータが既に存在する場合、コマンドはデフォルトで失敗します。既存のデータを置き換える場合は、CTASステートメントのWITH句でpgaa.purge_data_if_existsパラメーターをtrueに明示的に設定する必要があります。ライトワンス CTASは、アトミックな書き込みワンス操作です。データを変更するには、テーブルを削除し、新しいパスで再作成する必要があります。