はじめに
Snowflake Postgres の pg_lake では、Database と Postgres の間で Stage を使った双方向のファイル交換ができます。今回利用する Database → Postgres の方向も正式にサポートされています。なお、pg_lake のデータ移動機能は STANDARD または HIGH MEMORY インスタンスが必要で、BURSTABLE はサポートされません。
構成は以下のとおりです。
Snowflake Database のデータを Parquet 形式でステージに出力し、Snowflake Postgres の内部ストレージを経由して PostgreSQL テーブルへロードします。
データ連携の流れは以下のとおりです。
- Snowflake Database の
ORDERSテーブルをCOPY INTOで Parquet ファイルとして Internal Stage に出力 -
COPY FILESを使用して、Snowflake Postgres から参照可能な Internal Storage にファイルをコピー -
pg_lakeを利用し、COPY FROMでpublic.ordersテーブルにロード
1. pg_lake の有効化
Snowflake Postgres には GUI 画面が無いため、本検証では Microsoft の VS Code 向けの PostgreSQL 拡張機能を利用します。
セットアップは以下の記事が参考になりました。
接続が完了したら、pg_lake を有効化します。
CREATE EXTENSION pg_lake CASCADE;
SELECT *
FROM pg_extension
WHERE extname = 'pg_lake';
2. Snowflake Database の ORDERS を Parquet に出力
今回は Snowflake のサンプルデータ SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS を利用します。
まず作業用 Database / Schema / Stage を作成します。
CREATE DATABASE IF NOT EXISTS PG_LAKE_DEMO;
CREATE SCHEMA IF NOT EXISTS PG_LAKE_DEMO.PUBLIC;
CREATE OR REPLACE STAGE
PG_LAKE_DEMO.PUBLIC.SOURCE_STAGE;
ORDERS を Parquet で出力します。
COPY INTO @SOURCE_STAGE/orders/
FROM (
SELECT
*
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
)
FILE_FORMAT = (
TYPE = PARQUET
)
HEADER = TRUE;
ファイルを確認します。
LIST @SOURCE_STAGE;
3. Snowflake Postgres 用の Storage Integration を作成
Snowflake SQL 側から Snowflake Postgres の Internal Storage にアクセスするため、Storage Integration を作成します。
CREATE OR REPLACE STORAGE INTEGRATION PG_INTERNAL_STORAGE
TYPE = POSTGRES_INTERNAL_STORAGE
POSTGRES_INSTANCE = '<POSTGRES_INSTANCE_NAME>';
続いて Stage を作成します。
CREATE OR REPLACE STAGE PG_LAKE_DEMO.PUBLIC.PG_STAGE
RELATIVE_URL = '/demo'
STORAGE_INTEGRATION = PG_INTERNAL_STORAGE;
4. Stage から Snowflake Postgres 側へコピー
先ほど作成した Parquet ファイルを Snowflake Postgres の Internal Storage にコピーします。
COPY FILES
INTO @PG_STAGE/orders/
FROM @SOURCE_STAGE/orders/;
コピーされたことを確認します。
LIST @PG_STAGE/orders/;
5. Snowflake Postgres でデータをロード
Snowflake Postgres にて、SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS に合わせてテーブルを作成します。
CREATE TABLE public.orders (
o_orderkey BIGINT PRIMARY KEY,
o_custkey BIGINT,
o_orderstatus CHAR(1),
o_totalprice NUMERIC(12,2),
o_orderdate DATE,
o_orderpriority VARCHAR(15),
o_clerk VARCHAR(15),
o_shippriority INTEGER,
o_comment VARCHAR(79)
);
Snowflake Postgres の Internal Storage は @STAGE で参照できるため、以下を実行します。
COPY public.orders
FROM '@STAGE/demo/orders/*.parquet';
データを確認します。
SELECT *
FROM public.orders
LIMIT 10;




