はじめに
「Iceberg テーブルを Apache Spark & OCI Data Flow で操作する」 と題した前回の記事の最後に予告していた Autonomous AI Database から Apache Iceberg テーブルにアクセスする話です。
前回の投稿では、Apache Spark や OCI Data Flow で Iceberg テーブルを操作しました。
Warehouse ディレクトリを Object Storage の spark バケットの中の iceberg ディレクトリに設定し、そこに db.test という Iceberg テーブルを作成しました。
今回は、この Iceberg テーブルを Autonomous AI Database 26ai の外部表にしてみます。
パート1 では SQLcl を使ってコマンドラインから、パート2 では Data Studio を使って GUI から外部表を作成します。
パート1: SQLcl 編
SQLcl を使って、コマンドラインから外部表を作成します。SQL*Plus でも同様です。
SQLcl のインストールは こちら を参照して下さい。
Autonomous AI Database への接続は以下のようになります。
USER="ユーザー名"
PASSWORD="パスワード"
CONNECT_STR="ADBの接続文字列"
export TNS_ADMIN="ダウンロードしたウォレットの場所"
sql "$USER/$PASSWORD@$CONNECT_STR"
admin ユーザで作業
admin でログインして作業します。
- ユーザー
TESTUSERを作成して、一通り必要な権限を付与
SQL> CREATE USER TESTUSER IDENTIFIED BY ******;
User TESTUSER created.
SQL> GRANT CONNECT, RESOURCE TO TESTUSER;
Grant succeeded.
SQL> GRANT UNLIMITED TABLESPACE TO TESTUSER;
Grant succeeded.
SQL> GRANT EXECUTE on DBMS_CLOUD to TESTUSER;
Grant succeeded.
- オブジェクトストレージにアクセスするためのネットワークアクセス権限を TESTUSER に付与
SQL> BEGIN
2 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
3 host => '*.oraclecloud.com',
4 ace => xs$ace_type(
5 privilege_list => xs$name_list('http', 'connect', 'resolve'),
6 principal_name => 'TESTUSER',
7 principal_type => xs_acl.ptype_db
8 )
9 );
10 END;
11* /
PL/SQL procedure successfully completed.
- DATA_PUMP_DIR へのREAD/WRITE権限を TESTUSER に付与
SQL> GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO TESTUSER;
Grant succeeded.
TESTUSER ユーザーで作業
TESTUSER で接続し直して下さい。
- クレデンシャルを作成
Autonomous AI Database がオブジェクト・ストレージにアクセスするために必要なクレデンシャルを登録します。
リソース・プリンシパルを使う方法もありますが、今回は Object Storage にユーザー名/パスワードで接続する方式でやってみます。
ユーザー名は、コンソールの右上のアイコンをクリックするとプロファイルのすぐ下にユーザ名が出てきますので、そこをクリックすると
アイデンティティ > ユーザー > ユーザーの詳細 ページにジャンプします。
フェデレーションしている場合もあるので、ここの冒頭に出てくるユーザー名を使って下さい。

パスワードには、認証トークンを使います。持っていない場合は、このページの 認証トークン に進んで、認証トークンを作成して下さい。
ここでは、OS_CRED という名前のクレデンシャルを作成します。
SQL> BEGIN
2 DBMS_CLOUD.CREATE_CREDENTIAL(
3 credential_name => 'OS_CRED',
4 username => 'ユーザ名',
5 password => 'パスワード'
6 );
7 END;
8* /
PL/SQL procedure successfully completed.
クレデンシャルを使って、Object Storage にアクセスできるか、確認してみます。
DBMS_CLOUD.LIST_OBJECTS('クレデンシャル名', 'バケットのURI')
を使うと、指定したクレデンシャルを使って、指定したバケットにあるオブジェクトをリストできます。
SQL> SELECT OBJECT_NAME FROM DBMS_CLOUD.LIST_OBJECTS('OS_CRED', 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/NAMESPACE/b/spark/') where OBJECT_NAME like 'iceberg%';
OBJECT_NAME
____________________________________________________________________________________
iceberg/
iceberg/db/
iceberg/db/test/
iceberg/db/test/data/
...
(以降省略)
- 外部表を作成
DBMS_CLOUD.CREATE_EXTERNAL_TABLE() を使って外部表を作成します。
table_name credential_name iceberg_warehouse iceberg_table_path を適切な値に設定します。
SQL> BEGIN
2 DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
3 table_name => 'iceberg_db_test',
4 credential_name => 'OS_CRED',
5 file_uri_list => '',
6 format => '
7 {
8 "access_protocol" : {
9 "protocol_type" : "iceberg",
10 "protocol_config": {
11 "iceberg_catalog_type" : "hadoop",
12 "iceberg_warehouse" : "https://objectstorage.us-ashburn-1.oraclecloud.com/n/NAMESPACE/b/spark/o/iceberg",
13 "iceberg_table_path" : "db.test"
14 }
15 }
16 }'
17 );
18 END;
19* /
PL/SQL procedure successfully completed.
これで外部表が作成されました。SELECT してみましょう。
SQL> select * from iceberg_db_test;
ID DATA
_____ _______
5 df2
0 mod3
1 df1
6 mod3
2 df1
7 df2
3 mod3
4 df1
8 df2
9 mod3
10 rows selected.
OKですね。
パート2: Data Studio 編
Autonomous AI Database では GUI で外部表を作成することができます。
以降 Data Studio で作業しますが、パート1 で設定した TESTUSER への権限が効いている前提で話を進めます。
admin ユーザで作業
- TESTUSER の Web アクセスを有効化して DWROLE 権限を付与
データベース・アクション の データベース・ユーザー で設定します。
TESTUSER ユーザで作業
一旦ログアウトして、TESTUSER でログインし直して下さい。
Data Studio の データ・ロード を開きます。
データのリンク を選択します。
クラウド・ストアは現在何もない状態です。
「クラウド・ストアの場所の作成」をクリックして、新規作成します。
資格証明は、SQLcl ですでに OS_CRED を作っていたので、それをそのまま使います。
バケット URI を指定します。
https://objectstorage.us-ashburn-1.oraclecloud.com/n/NAMESPACE/b/spark/o
「次」を押して、バケットにアクセスできていることを確認して下さい。
「作成」ボタンを押します。
左側のディレクトリから、地球マークになっている Icebergテーブルを右側のペインにドラッグ&ドロップすると、自動的に内容を分析して外部表を作成する準備をしてくれます。
「開始」ボタンを押します。
外部表ができました!
SELECT して確認しておきましょう。
まとめ
SQLcl と Data Studio の2種類の方法で、Iceberg テーブルから外部表を作成してみました。特に Data Studio では簡単な操作で外部表があっさり作れてしまいましたね...。
権限まわりで躓かなかったら、スムースに行くと思います。











