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操作を実行できます。

スタンドアロンの保存場所を使用する
----------------------------------

この方法は、1回限りのエクスポートまたはアドホックデータの移動に最適です。
PGAAは、Postgres行からターゲット形式への変換を処理し、必要なメタデータまたはトランザクションログIcebergマニフェストまたはDeltaトランザクションログなどを生成し、単一のアトミック操作で結果をコミットします。

CTASを介してオブジェクトストレージにテーブルをプロビジョニングするには、2段階のプロセスが必要です。最初に、ストレージの場所を介してリモートストレージ環境への物理接続を確立し、次にクエリ結果をその場所にマッピングするSQLコマンドを実行します。

保存場所の作成
^^^^^^^^^^^^^^

オブジェクトストレージに書き込むには、 
`create a PGFS storage location <https://www.enterprisedb.com/docs/edb-postgres-ai/latest/ai-factory/pipeline/pgfs/functions/#creating-a-storage-location>`_ 
を行う必要があります。これにより、ターゲットバケットが定義され、必要な資格情報が提供されます。例

.. code:: sql

   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": "..."}
   );

..  Note::
   保存場所に関連付けられた資格情報には、宛先バケットの読み取りおよび書き込み権限が必要です。これは、次のファンクションを実行して確認できます。成功した場合は`NULL` を結果ます。

.. code:: sql

       SELECT pgaa.test_storage_location (my_lake_data, true);

CTASを使用したテーブルの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``USING PGAA WITH`` および\ ``AS``
句を使用して、結果セットをオブジェクトストレージの構造化テーブルフォーマットに直接エクスポートするテーブルを作成します。例

.. code:: sql

   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インスタンスに登録します。例

.. code:: sql

   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"
       }
   );

構成オプションの完全なリストについては、
:ref:`カタログ接続の追加 <カタログ接続の追加>` を参照してください。

..  Note::
   カタログへの書き込み権限が必要です。これは、次のファンクションを実行して確認できます。成功した場合は`NULL` を結果ます。

.. code:: sql

       SELECT pgaa.test_catalog(my_iceberg_catalog, test_writes := TRUE);

カタログ管理CTASテーブルの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``USING PGAA WITH`` および\ ``AS``
句を使用して、結果セットを構成済みのIcebergカタログに直接エクスポートするテーブルを作成します。例

.. code:: sql

   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_namespace``
  Icebergカタログ内でテーブルが配置される名前空間またはデータベースを定義します。

- ``pgaa.catalog_table``
  データレイクに作成するテーブルの名前を設定します。

CTASの制限
----------

CTASはデータの移動と変換のための強力なツールですが、次の制約のある特定の実行モデルで動作します。

- **エンジンの依存関係**
  CTAS操作を実行する場合、ソース内部クエリはDirectScanを利用しません。代わりに、データの取得は、CompatScanを介して標準のPostgresエンジンによって処理されます。したがって、\ ``SELECT``
  フェーズ内の複雑な結合または集計は、Seafowlエンジンが提供する完全なベクトル化加速の恩恵を受けられません。

- **自動上書きなし**
  偶発的なデータの損失を防ぐため、スタンドアロンの保存場所を使用する場合、指定された\ ``pgaa.path``
  にデータが既に存在する場合、コマンドはデフォルトで失敗します。既存のデータを置き換える場合は、CTASステートメントの\ ``WITH``
  句で\ ``pgaa.purge_data_if_exists``
  パラメーターをtrueに明示的に設定する必要があります。

- **ライトワンス**
  CTASは、アトミックな書き込みワンス操作です。データを変更するには、テーブルを削除し、新しいパスで再作成する必要があります。
