はじめに
ibm-lh-clientパッケージには、watsonx.dataへのアクセスや、watsonx.dataと連携するアプリケーションを開発するための便利なユーティリティとライブラリが含まれています。
ここでは、ibm-lh-clientパッケージ内のprestro-cli、presto-runを使用したSQLの実行例を紹介します。
環境
使用したサーバ環境は以下になります。
・Red Hat OpenShift Container Platform 4.14
・IBM Cloud Pak for Data (CP4D) 5.0.3
・IBM watsonx.data 2.0.3
・Presto (Java) v0.286
使用したクラアント環境は以下になります。
・Red Hat Enterprise Linux release 8.10 (Ootpa)
・Podman version 4.9.4-rhel
事前準備
ibm-lh-clientパッケージを使用するには、インストールと設定が必要です。次のQiita記事をご参照ください。
- インストール:ibm-lh-clientのインストール
- 設定:ibm-lh-clientの設定
ibm-lh-clientのインストールで、ibm-lh-clientパッケージを${HOME}/watsonxdata
ディレクトリの下にインストールしました。ibm-lh-clientの設定で、エンジン名PRESTO01
を登録しました。
ibm-lh-clientパッケージを利用してSQLを実行する
ibm-lh-clientパッケージを利用してSQLを実行するには、3つのパータンがあります。詳細はRunning SQL queries by using ibm-lh-clientを参照してください。
- presto-cliでインタラクティブセッションを使用する方法
- presto-runで非インタラクティブセッションを使用する方法
- presto-runでSQLファイルを使用する方法
presto-cliでインタラクティブセッションの使用例
インタラクティブセッションを起動するコマンドの例は以下の通りです。ENGINE_NAME
は、ibm-lh-clientの設定で登録したエンジン名です。
bin/presto-cli --engine=ENGINE_NAME
インタラクティブセッションを起動すると、SQLコマンドを対話的に入力できるようになります。今回は、presto-cliでSQLコマンドを使用してスキーマとテーブルを作成し、そのテーブルにデータを挿入してみました。ここではCREATE SCHEMA statement、CREATE TABLE statement、INSERT statementが必要になります。詳細については、CREATE SCHEMA statement、CREATE TABLE statement、INSERT statementを参照してください。
今回実行した例は以下の通りです。
1.CREATE SCHEMA statementを使用して、カタログiceberg_data
下にスキーマmy_schema
を作成しました。
2.CREATE TABLE statementとを使用して、my_schema
の下に2つの列を持つテーブルtest01
を作成しました。
3.INSERT statementを使用して、テーブルtest01
に1
と2
を挿入しました。
[user01@client ~]$ cd ${HOME}/watsonxdata
[user01@client watsonxdata]$ cd bin
[user01@client bin]$ ./presto-cli --engine=PRESTO01 --catalog=iceberg_data
presto> CREATE SCHEMA IF NOT EXISTS my_schema with (location='s3a://iceberg-bucket/my_schema');
CREATE SCHEMA
presto> CREATE TABLE iceberg_data.my_schema.test01 (col1 int , col2 int);
CREATE TABLE
presto> insert into iceberg_data.my_schema.test01 values (1,2);
INSERT: 1 row
Query 20241023_090122_00265_p2h32, FINISHED, 1 node
Splits: 19 total, 19 done (100.00%)
[Latency: client-side: 0:03, server-side: 0:02] [0 rows, 0B] [0 rows/s, 0B/s]
presto>
presto-runで非インタラクティブセッションの使用例
非インタラクティブセッションの構文は以下の通りです。ENGINE_NAME
は、ibm-lh-clientの設定で登録したエンジン名です。
bin/presto-run --engine=ENGINE_NAME <<< "SQL statement"
今回は、上のpresto-cliでインタラクティブセッションの使用例で作成したテーブルtest01
をpresto-runでクエリしてみました。ここではSELECT statementが必要になります。詳細については、SELECT statementを参照してください。
今回実行した例は以下の通りです。SELECT statementを使用して、test01
の情報をクエリしました。
[user01@client bin]$ ./presto-run --engine=PRESTO01 <<< "SELECT * FROM iceberg_data.my_schema.test01;"
presto> SELECT * FROM iceberg_data.my_schema.test01;
col1 | col2
------+------
1 | 2
(1 row)
Query 20241025_055313_00143_p2h32, FINISHED, 1 node
Splits: 17 total, 17 done (100.00%)
[Latency: client-side: 0:01, server-side: 324ms] [1 rows, 90B] [3 rows/s, 277B/s]
presto>
[user01@client bin]$
presto-runでSQLファイルの使用例
コンテナー化されたibm-lh クライアントからSQLファイルを参照するために、sandboxディレクトリをLH_SANDBOX_DIR
環境変数に登録します。ENGINE_NAME
は、ibm-lh-clientの設定で登録したエンジン名です。PATH_SANDBOX_DIR_SQL_FILE
はsandboxディレクトリ内のSQLファイルを指定します。
bin/presto-run --engine=ENGINE_NAME -f PATH_SANDBOX_DIR_SQL_FILE
今回は、上のpresto-cliでインタラクティブセッションの使用例で作成したテーブルtest01
をSQLファイルでクエリしてみました。ここではSELECT statementが必要になります。詳細については、SELECT statementを参照してください。
今回実行した例は以下の通りです。SQLファイルa.sql
の内に2回のSELECT statementがあります。presto-runでa.sql
を読み込み実行した結果、期待通り"1","2"
が2回返されました。
[user01@client bin]$ export LH_SANDBOX_DIR=$HOME/test
[user01@client bin]$ mkdir ${LH_SANDBOX_DIR}
[user01@client bin]$ cat ${LH_SANDBOX_DIR}/a.sql
SELECT * FROM trg24264.test.test06;
SELECT * FROM trg24264.test.test06;
[user01@client bin]$ ./presto-run --engine=PRESTO01 -f ${LH_SANDBOX_DIR}/a.sql
"1","2"
"1","2"
[user01@client bin]$