Autonomous Database（ADB）でParquetファイルをロードするときのメモ

# はじめに
本記事は、Autonomous Database（ADB）でParquetファイルをロードするときのメモ
DBMS_CLOUDパッケージを利用する方法などもあるが、ここではGUI（Database Actions）を使った方法について記載。
### Parquetファイルを扱うモチベーション
[Open Targets Platform](https://platform-docs.opentargets.org/)のデータ利活用準備（データベースのテーブル化）をシンプルに実現したい
# 事前準備
## リソースプリンシパルの有効化
ADBから任意のクラウドストレージにアクセスするための認可を設定
→ ここでは、OCIのリソースプリンシパルを用いることで、安全にADBからクラウドストレージにアクセス可能とする

参考： [Autonomous Databaseでリソースプリンシパルを有効化する](https://qiita.com/nakaie/items/1ba691114b89b9deccb2)

## データの準備
Object Storageにデータをロード
ここでは以下の手順でopentargetsのデータをObject Storageにコピーします。
1. Wgetを使ってローカル環境にデータを保存
1. 保存したデータとObject Storageとをrsyncで同期

Wgetを使ってローカル環境にデータを保存
```bash
# Wgetを使ってローカル環境にデータを保存
cd ${work directory}
wget -r \
     -np \
     -nH \
     --cut-dirs=6 \
     -R "index.html*" \
     ftp://ftp.ebi.ac.uk/pub/databases/opentargets/platform/25.03/output/association_by_datasource_direct/


# 保存したデータとObject Storageとをrsyncで同期
oci os object bulk-upload -ns ${your Name Space} -bn ${your bucket name} --src-dir .

```

# シナリオ1: （簡易アプローチ）Database Actionsの利用
## 概要
Database Actionsを利用して、GUIでデータをロード
## 実現ステップ
1. Database Actions/Data Studio/Loadの起動
1. ロード対象ファイルの選択
1. ロード実行
1. 確認
---
1. Database Actions/Data Studio/Loadの起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/c337dc99-2b7b-4477-99cd-71bdda93b5af.png)

2. ロード対象ファイルの選択
「データ・ロード」→ 「クラウド・ストア」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/ea0dc6d6-c420-48b9-ac11-c1d4f86445a6.png)

クラウド・ストアの場所を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/2a67deb5-e3c5-4456-90af-89e10cf35513.png)
OCIバケット/adbを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/31b5f581-9989-4dc8-b703-8fc5ea455a20.png)

該当するフォルダを選択して、右側にドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/ae53c007-9a70-4f78-ba45-6d8c113c358a.png)

「はい」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/70d187a5-42f3-4aab-836d-ccd09061552b.png)

↓と同じような状態になっているとOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/98bf208b-98d1-4d07-bbcf-bc2e9cb435da.png)

名前のところをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/126a25dc-1d58-417e-aac4-0fcd40339677.png)

設定内容を確認（自動で以下のような設定となっている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/657e2d18-20eb-464f-8d6d-311a1a183c42.png)

プレビューでデータが入っていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/1a537176-fa7a-425e-bab0-c520e460d865.png)

（参考）実際に実行されるSQL
```SQL
CREATE TABLE "PARQUET"."ASSOCIATION_BY_DATASOURCE_DIRECT"
   (
     "DATATYPEID"         VARCHAR2(32767)
    ,"DATASOURCEID"       VARCHAR2(32767)
    ,"DISEASEID"          VARCHAR2(32767)
    ,"TARGETID"           VARCHAR2(32767)
    ,"SCORE"              BINARY_DOUBLE
    ,"EVIDENCECOUNT"      NUMBER(19,0)
   );

DECLARE
  l_TABLE_NAME        DBMS_QUOTED_ID := '"ASSOCIATION_BY_DATASOURCE_DIRECT"';
  l_CREDENTIAL_NAME   DBMS_QUOTED_ID := '"OCI$RESOURCE_PRINCIPAL"';
  l_FILE_URI_LIST     CLOB :=
    q'[https://objectstorage.ap-tokyo-1.oraclecloud.com/n/orasejapan/b/adb/o/association_by_datasource_direct/*.parquet]';
  l_FIELD_LIST        CLOB := null;
  l_FORMAT            CLOB :=
    '{
       "schema" : "first",
       "type" : "parquet",
       "logprefix" : "ASSOCIATION_BY_DATASOURCE_DIRECT"
     }';
  l_SCHEMA_NAME       DBMS_QUOTED_ID := '"PARQUET"';
  l_OPERATION_ID      NUMBER ; /* OUT */
BEGIN
  "C##CLOUD$SERVICE"."DBMS_CLOUD"."COPY_DATA"
  ( TABLE_NAME        => l_TABLE_NAME
   ,CREDENTIAL_NAME   => l_CREDENTIAL_NAME
   ,FILE_URI_LIST     => l_FILE_URI_LIST
   ,FIELD_LIST        => l_FIELD_LIST
   ,FORMAT            => l_FORMAT
   ,SCHEMA_NAME       => l_SCHEMA_NAME
   ,OPERATION_ID      => l_OPERATION_ID
  );
END;
/

DECLARE
  l_ACTIONS CLOB :=
    '{
       "tableName" : "ASSOCIATION_BY_DATASOURCE_DIRECT",
       "postIngestActions" :
       [
         {
           "type" : "columnTrim"
         }
       ]
     }';
BEGIN
  "C##ADP$SERVICE"."DBMS_INGEST_ACTIONS"."RUN_POST"(l_ACTIONS);
END;
/

```

ロード実行

「開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/befe14fe-b143-4265-bfc9-d6988b3825ea.png)

ロード中のステータス確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/2aca2daa-b48e-4c92-afe6-723d8d1984ab.png)

4. 確認

SQL Developer WEB（Database Actions/SQL）でデータがロードされているかを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/8bfa2c32-3ff7-41d8-96c4-020050f2f397.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/f68b6f20-d6eb-4e2e-bb5d-0f518bf88b98.png)

# 参考
- [DBMS_CLOUD Avro、ORCおよびParquetのサポート](https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/dbms-cloud-avro-orc-parquet-options.html)
- [[OCI]Autonomous Database:Amazon S3上にあるParquetファイルに対する外部表を作成してデータを参照してみた](https://qiita.com/500InternalServerError/items/7ab03cc1760bbb7d18b4)
- [Autonomous Databaseでリソースプリンシパルを有効化する](https://qiita.com/nakaie/items/1ba691114b89b9deccb2)
- https://platform-docs.opentargets.org/