3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SnowflakeのデータにApache IcebergとADBを使って自然言語(NL2SQL)で問い合わせてみた

Posted at

前回の記事ではADBの異種DB向けDBLink機能を使ってSnowflakeと連携し、ADBからSELECT AI (NL2SQL) でSnowflake上のデータを参照しました。

今回はSnowflakeとADBのデータ連携を、よりオープンな仕組みであるApache Icebergで実現してみました。
その上でADBのSELECT AIと組み合わせ、Snowflake側で作成したIceberg形式のデータに自然言語で問い合わせてみました。

検証環境

前回と同様OCI TokyoリージョンのADBと、AWS TokyoリージョンのSnowflakeを使いました。
またIcebergテーブルはAWS TokyoリージョンのS3上に作成しました。

検証手順

Snowflake側の作業

Snowflake側の作業は下記チュートリアルに従いました。

「データをロードしてテーブルをクエリする」まで実行すると、customer_iceberg テーブルと nation_iceberg テーブルがIceberg形式でS3上に作成されます。
S3バケットを確認すると、Iceberg形式のデータファイル、メタデータファイルがあります。

customer_iceberg テーブルのデータファイル
2025-07-17 001719.png

customer_iceberg テーブルのメタデータファイル
2025-07-17 001753.png

nation_iceberg テーブルのデータファイル
2025-07-17 001804.png

nation_iceberg テーブルのメタデータファイル
2025-07-17 001815.png

Snowflakeコンソール上で次のようにクエリを実行し、両テーブルのデータがちゃんと参照できることを確認します。

SELECT
    c.c_name AS customer_name,
    c.c_mktsegment AS market_segment,
    n.n_name AS nation
  FROM customer_iceberg c
  INNER JOIN nation_iceberg n
    ON c.c_nationkey = n.n_nationkey
  LIMIT 15;

2025-07-17 001530.png

ADB側の作業

まずADBからAmazon S3へのアクセスを可能にするための認証を設定します。
具体的な手順は下記を参考にさせて頂きました。

こちらの記事の以下手順を実行します。

1. ARNを用いたロールベースの認証の有効化
2. AWSのポリシーとロールの設定
4. ARNを使用したクレデンシャルの作成

クレデンシャルを作成できたら外部テーブルを作成し、S3上で管理されているIceberg形式の customer_iceberg テーブル、nation_iceberg テーブルを参照できるようにします。
外部テーブルの作成コマンドは下記を参考にしました。

customer_iceberg テーブルを参照する外部テーブルの作成

BEGIN 
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE( 
        table_name => 'customer_iceberg', 
        credential_name => 'MY_S3_ARN_CRED', 
        file_uri_list => 'your s3 uri for customer_iceberg metadata json file', 
        format => '{"access_protocol":{"protocol_type":"iceberg"}}'
    ); 
END;

nation_iceberg テーブルを参照する外部テーブルの作成

BEGIN 
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE( 
        table_name => 'nation_iceberg', 
        credential_name => 'MY_S3_ARN_CRED', 
        file_uri_list => 'your s3 uri for nation_iceberg metadata json file', 
        format => '{"access_protocol":{"protocol_type":"iceberg"}}'
    ); 
END;

試しに外部テーブル customer_icebergnation_iceberg を参照するクエリを実行してみます。
今回はADBのDatabase Actionsから実行してみました。

SELECT
    c.c_name AS customer_name,
    c.c_mktsegment AS market_segment,
    n.n_name AS nation
  FROM customer_iceberg c
  INNER JOIN nation_iceberg n
    ON c.c_nationkey = n.n_nationkey
  FETCH FIRST 15 ROWS ONLY;

2025-07-17 004305.png

ちゃんとS3上のIceberg形式のデータを参照できています。
あとはSELECT AIを設定し、自然言語で問い合わせできるようにします。

まずは生成AIモデルを使うためのクレデンシャルを作成します。
今回はOCI Generative AI Serviceが提供するCohereの command-r-plus-08-2024 を使います。

今回は ADMIN ユーザで作業したため、新規DBユーザ作成や権限付与は行っていません。
ADMIN ユーザ以外で行う場合、以降の作業へ進む前に権限付与が必要となります。

-- OCIアカウントのクレデンシャルを作成
BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OCI_GENAI',
        user_ocid       => 'your user ocid',
        tenancy_ocid    => 'your tenancy ocid',
        private_key     => 'your user private key',
        fingerprint     => 'your fingerprint related to your user private key'
    );
END;
/

作成したクレデンシャルを使って生成AIと連携するためのAIプロファイルを作成します。

BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        'GENAI_COHERE',
        '{
            "provider": "oci",
            "credential_name": "OCI_GENAI",
            "model":"cohere.command-plus-latest",
            "oci_apiformat":"COHERE",
            "region": " ap-osaka-1",
            "object_list": [
                    {"owner": "ADMIN", "name": "customer_iceberg"},
                    {"owner": "ADMIN", "name": "nation_iceberg"}
            ]
        }'
    );
END;
/

SELECT AIの設定ができたので、最後に自然言語でS3上のIceberg形式のデータへ問い合わせてみます。

SELECT DBMS_CLOUD_AI.GENERATE(prompt       => 'customer_iceberg表においてc_mktsegmentの種別を10件表示してください。',
                              profile_name => 'GENAI_COHERE',
                              action       => 'runsql')
FROM dual;

2025-07-17 020347.png

念のため自然言語から変換されたSQLを確認してみます。

SELECT DBMS_CLOUD_AI.GENERATE(prompt       => 'customer_iceberg表においてc_mktsegmentの種別を10件表示してください。',
                              profile_name => 'GENAI_COHERE',
                              action       => 'showsql')
FROM dual;

2025-07-17 020416.png

意図したSQLに変換されているようです。

以上、Apache Icebergを使ったSnowflakeとADB間のデータ連携、およびADBのSELECT AIを使った自然言語によるデータ参照でした。
データの保管形式をApache Icebergにしておけば様々なDWHから参照できるため便利ですね。
またADBのSELECT AIと組み合わせれば、任意の生成AIを使ったNL2SQLがIcebergテーブルに対して実現できます。
データ利活用の幅を広げる上で、Apache Icebergは使い勝手の良い選択肢だと思いました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?