Oracle Cloud Infrastructure Data Scienceを使って、Oracle Autonomous Database(ADW)のデータにアクセスしてみる


本記事の狙い

2020/2に、Oracle Cloud Infrastructure Data Science(OCI-Data Science)がリリースされました。
本記事では、実際にOCI-Data Scienceを使って、Oracle Autonomous Database(ADW)上のデータにクエリする手順を、実際に実施してみたいと思います。

参考文献

実施に参考になるリンク

その他、参考文献

手順

以下のような手順で実施します。
1.OCI-Data Scienceの設定
2.Oracle Autonomous Database(ADW)の構築
3.OCI-Data ScienceからADWに接続できるようにするための設定
4.実際にOCI-Data Scienceから、ADW上のデータにクエリする

1.OCI-Data Scienceの設定

上記参考文献の「Oracle Cloud Infrastructure Data Science(OCI-Data Science)を使ってみよう」を参考にOCI-Data Scienceのノートブック環境を構築、設定をします。
手順とおりに実施すれば、それほど難しくないのでは、と思います。

  1. Oracle Cloudの基本的な設定の後に、ノートブック環境を構築します。
  2. getting-started.ipynbを使って、ノートブック環境(JupyerLab)の初期作業を行います。

2.Oracle Autonomous Database(ADW)の構築

上記参考文献の「Autonomous Database(ADB,ADW,ATP)の作成とSQL Developerからの接続」を参考に、ADWを構築、設定をします。
今回は簡単なクエリを実施できればいいので、あまり難しく考えずに、「ADWの作成」を見ながら、ADWを作成します。「使用可能」のステータスまで10分ぐらいでしょうか。超簡単。

3.OCI-Data ScienceからADWに接続できるようにするための設定

OCI-Data Scienceの中には、/home/datascience/ads-examples 配下のディレクトリに、多くのサンプルノートブックファイルが存在します。
これらサンプルファイルで、基本的な使い方は大体網羅されていますが、今回はその中の一つ、ads_load_data_from_ADW_1.ipynb というサンプルファイルを使います。

このサンプルノートブックの順序に従ってやればできるようになっています。
実際やってみます。下記のa-hは、サンプルノートブック内記載の手順に準拠しています。

a.ADWのDB接続ボタンをクリック

まずは、OCI-Data ScienceとADWを接続設定します。
ADWのDB接続ボタンをクリックします。

b.ウオレットのダウンロード

ダウンロードボタンより、ウオレットをダウンロードします。
ウォレットためのパスワード指定を求められるので入力してダウンロードします。

c.ノートブック環境にフォルダ作成

ノートブック環境に、ウオレットをおく、フォルダを作成します。
 /home/datascience/block_storage 配下に新規ディレクトリ(下記の場合、MOADW)を作成します。

d.接続設定ファイルアップロード

ダウンロードしてきたzipファイルを解凍し、全てのファイルを、上記フォルダにアップロードします。
ノートブック環境であるJupyterLabのアップロードボタンを使ってアップロードします。

d.sqlnet.oraのMETHOD_DATAの変更

アップロードした、sqlnet.oraのMETHOD_DATAを、上記ディレクトリのパスに変更します。

e.環境変数:TNS_ADMINの設定

環境変数:TNS_ADMINを、上記ディレクトリに設定します。
各自の環境のパスに変更後、ノートブック上でShift+Returnで実行します。

# Replace with your TNS_ADMIN value here:
%env TNS_ADMIN=/home/datascience/block_storage/MOADW

f.環境変数:ADW_SIDの設定

環境変数:ADW_SIDを、tnsnames.oraのSIDに変更します。
tnsnames.oraを確認します。

環境変数を読み込みます。

# Replace with your SID name here: 
%env ADW_SID=moadw_high

g.環境変数:ユーザー名とパスワードの設定

ADWにアクセスできる、ユーザー名/パスワードを入力します。

# Replace with your ADW user name and password here: 
%env ADW_USER=<ADWのユーザー名>
%env ADW_PASSWORD=<ADWのユーザーのパスワード>

h.接続テスト

最後に接続テストを行います。
ADWに接続、Disconnectedすれば成功です。

!echo exit | sqlplus $ADW_USER/$ADW_PASSWORD@$ADW_SID

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Mar 10 05:45:33 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Last Successful login time: Tue Mar 10 2020 04:33:50 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0

以上で、OCI-Data ScienceとADWを接続設定設定は終了です。
これで、OCI-Data ScienceからADWにアクセスができるようになっています。

もしエラーが出る場合は、特に以下を確認ください。
- ADWは正常に起動しているか、パスワードなどは間違いないか。
- 上記a-gはきちんと設定されているか。
- getting-started.ipynbは、エラーなく実行できているか。特に「Testing the Access to our API」まで正常に設定できているか。

4.実際にOCI-Data Scienceから、ADW上のデータにクエリする

0.SQL Developer Webを使ったサンプルデータのロード

実際にクエリアクセスをする前に、ADWにサンプルデータを入力します。
今回は下記のようなサンプルデータをローカルPCでExcelで作り、SQL Developer Webを使って、ADWにテーブル作成とデータロードしました。
SQL Developer Webの使い方は、上記参考文献、「SQL Developer Webによるローカル・ファイルからのデータのロード」を参考にしてください。
SQL Developer Web、超簡単、超便利 !!

いよいよ、OCI-Data ScienceからADW上のデータにクエリしますが、これにはいくつかの方法があります。
今回は、上記設定手順も記載されているサンプルノートブックads_load_data_from_ADW_1.ipynb に記載されている、1−3の方法を実施します。

**
1.Load an ADW database Table as an ADSDataset object
2.Query data from ADW using pandas
3.Query data from ADW using cx_Oracle

1.Load an ADW database Table as an ADSDataset object

では実際にADW上のデータにOCI-Data Scienceからアクセスしてみたいと思います。
1つ目の方法は、ADSのDatasetFactoryクラスを使って、ADWのデータをクエリし、ADSDatasetにロードする方法です。
ADSとは、OCI-Data Scienceに含まれる、独自のPythonライブラリです。詳細は、参考文献のADSのドキュメントを参考にしてください。

まずは必要なライブラリをインポートします。


%load_ext autoreload
%autoreload 2

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning) 

import pandas as pd
import logging
import os

logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO)

from ads.dataset.factory import DatasetFactory

接続に必要なURIを設定します。


uri=f'oracle+cx_oracle://{os.environ["ADW_USER"]}:{os.environ["ADW_PASSWORD"]}@{os.environ["ADW_SID"]}'

Table名と、Indexを指定し、データをロードします。


table="PURCHASE_ITEM"
index_col="cust_id"
ds = DatasetFactory.open(uri, format="sql", table=table, index_col=index_col)

確認してみます。


ds.head()

でもいいのですが、ADSにはshow_in_notebookという便利な可視化ライブラリがあるので、こちらでざっと属性を見てみます。


ds.show_in_notebook()

各属性ごとに下記のような形で、特徴や値の分布が表示されます。

それぞれの属性の相関図も見ることもできます。

これらが、ds.show_in_notebook() の、一行のコマンドでできてしまう!
超便利!

2.Run a SQL query on your ADW database using SQLAlchemy and Pandas

次のサンプルは、pandasとsqlalchemyを使って、ADWから読み込む方法です。
参考文献「SQLAlchemy から Pandas にデータを読み込む」も参考ください。

from sqlalchemy import create_engine

engine = create_engine(uri)
ds_01 = pd.read_sql('SELECT * from PURCHASE_ITEM', con=engine)

read_sql_queryを使って、where句を使うこともできます。

ds_02=pd.read_sql_query(
    '''
    SELECT cust_id, age from PURCHASE_ITEM
    '''
    , uri)

pandasのDataFrameを、ADSのDataframeに変換することもできます。
サンプルノートブックads_load_data_from_ADW_1.ipynbには、DatasetFactory.open()を使ったサンプルがのっていますが、

ds_03 = DatasetFactory.open(ds_02)

DatasetFactory.from_dataframe()を使うこともできます。
これは、参考文献のADSのドキュメントにのっていました。

ds_03 = DatasetFactory.from_dataframe(ds_02)

3.Query data from ADW using cx_Oracle

cx_ORACLEを使ってクエリを実施することもできます。

import cx_Oracle
connection = cx_Oracle.connect(os.environ["ADW_USER"], os.environ["ADW_PASSWORD"], os.environ["ADW_SID"])
cursor = connection.cursor()
results = cursor.execute("""
    SELECT * from PURCHASE_ITEM
    """)
data = results.fetchall()
df = pd.DataFrame(np.array(data))
ds_04 = DatasetFactory.from_dataframe(df)

終わりに

今回は、OCI-Data Scienceにサンプルとして含まれる、ads_load_data_from_ADW_1.ipynb をベースに、OCI-Data ScienceからADWにクエリしてみましたが、それ以外にも方法はあります。

また、ADSを使って、ADW上のデータからモデル生成をしたり、推論した結果をADW上のデータにInsertする方法も、サンプルノートブックや、ADSのドキュメントの「Loading Data」に記載しているので参考にしてみてください。
それ以外にも、AWSのS3上のデータからOCI-Data Scienceにデータをロードする方法も記載されています。

OCI-Data Scienceは、最大30日間300$分の無償クレジットが使えるOracle Free Trialの、対象サービスですので、ぜひ実際に使ってみることをおすすめします。

Let's Enjoy Data Science!