ibm-lh-clientでSQLを実行してみた

## はじめに
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のインストール](https://qiita.com/Xu_Mingqin/private/f8d86eea20a08b214588 )
- 設定：[ibm-lh-clientの設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)


[ibm-lh-clientのインストール](https://qiita.com/Xu_Mingqin/private/f8d86eea20a08b214588 )で、ibm-lh-clientパッケージを`${HOME}/watsonxdata`ディレクトリの下にインストールしました。[ibm-lh-clientの設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)で、エンジン名`PRESTO01`を登録しました。
## ibm-lh-clientパッケージを利用してSQLを実行する
ibm-lh-clientパッケージを利用してSQLを実行するには、3つのパータンがあります。詳細は[Running SQL queries by using ibm-lh-client](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=utilities-running-sql-queries-by-using-lh-client)を参照してください。
- presto-cliでインタラクティブセッションを使用する方法
- presto-runで非インタラクティブセッションを使用する方法
- presto-runでSQLファイルを使用する方法

### presto-cliでインタラクティブセッションの使用例
インタラクティブセッションを起動するコマンドの例は以下の通りです。`ENGINE_NAME`は、[ibm-lh-clientの設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)で登録したエンジン名です。
```
bin/presto-cli --engine=ENGINE_NAME 
```
インタラクティブセッションを起動すると、SQLコマンドを対話的に入力できるようになります。今回は、presto-cliでSQLコマンドを使用してスキーマとテーブルを作成し、そのテーブルにデータを挿入してみました。ここではCREATE SCHEMA statement、CREATE TABLE statement、INSERT statementが必要になります。詳細については、[CREATE SCHEMA statement](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=statements-create-schema)、[CREATE TABLE statement](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=statements-create-table)、[INSERT statement](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=statements-insert)を参照してください。

今回実行した例は以下の通りです。
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の設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)で登録したエンジン名です。
```
bin/presto-run --engine=ENGINE_NAME <<< "SQL statement"
```
今回は、上の[presto-cliでインタラクティブセッションの使用例](https://qiita.com/Xu_Mingqin/private/83d1a63d3b5447f3a31c#presto-cliでインタラクティブセッションの使用例)で作成したテーブル`test01`をpresto-runでクエリしてみました。ここではSELECT statementが必要になります。詳細については、[SELECT statement](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=statements-select)を参照してください。

今回実行した例は以下の通りです。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の設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)で登録したエンジン名です。`PATH_SANDBOX_DIR_SQL_FILE`はsandboxディレクトリ内のSQLファイルを指定します。
```
bin/presto-run --engine=ENGINE_NAME -f PATH_SANDBOX_DIR_SQL_FILE
```
今回は、上の[presto-cliでインタラクティブセッションの使用例](https://qiita.com/Xu_Mingqin/private/83d1a63d3b5447f3a31c#presto-cliでインタラクティブセッションの使用例)で作成したテーブル`test01`をSQLファイルでクエリしてみました。ここではSELECT statementが必要になります。詳細については、[SELECT statement](https://www.ibm.com/docs/en/watsonx/watsonxdata/2.0.x?topic=statements-select)を参照してください。

今回実行した例は以下の通りです。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]$
```