Jupyter NotebookでOracleデータベースに接続する
投稿日: 2018年05月11月 更新日: 2018年05月11月
概要
Jupyter NotebookでOracleデータベースに接続してデータ分析できる環境を整えた。
環境
- CentOS 6.9 64ビット版(諸事情により古い)
- anyenv経由でpyenvが入ってる
Pythonのインストール
pyenvを使って現時点(2018.5.11)の最新版である3.6.5をインストールした。インストール前にsqliteとbzip2のライブラリを入れておく。
# pyenv install -l
# yum install sqlite-devel bzip2-devel
# pyenv install 3.6.5
# pyenv local 3.6.5
python -v とかしてバージョンを確認する。
sqlite-develを入れ忘れるとjupyter notebook起動時にエラーが出るので注意。その場合sqlite-develを入れて、pyenv installを再度実行しコンパイルし直す必要あり。
Jupyter Notebookのインストール
http://jupyter.readthedocs.io/en/latest/install.html
公式ドキュメント通り、pip自身をアップグレードしてからインストールした。
# pip3 install --upgrade pip
# pip3 install jupyter
下記コマンドでJupyter Notebookが起動することを確認する。(本当はrootで実行するのは良くない)
# jupyter notebook --allow-root
Oracle接続のための設定
PythonのOracle接続モジュールであるcx_Oracleを使う。
cx_OracleはOracle社が提供するOracle Instant Client(Oracle接続用ライブラリ等)が必要となるので事前にインストールと設定が必要。
cx_Oracle及びOracle Instant Clientのインストール方法はcx_Oracleの公式インストールドキュメントに書いてある。
http://cx-oracle.readthedocs.io/en/latest/installation.html
Oracle Instant Clientのインストールと設定
Oracle Technology Network(OTN)から適切なOracle Instant Clientをダウンロードする。今回は下記からダウンロードした。ダウンロードにはOTNのアカウントが必要。
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
必要なのは下記ファイル。バージョンは常に最新のものを使えばいいと思う。
instantclient-basic-linux.x64-12.2.0.1.0.zip
インストールはダウンロードしたファイルを解凍するだけで完了。
# mkdir -p /opt/oracle
# cd /opt/oracle
# unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
OSに対して上記ディレクトリからライブラリが読み込まれるように設定する。
sudo sh -c "echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig
cx_Oracleのインストール
# pip3 install cx_Oracle
Jupyter Notebook上で下記Pythonスクリプトが実行できるか確認する。
import cx_Oracle
cx_Oracle.clientversion()
ここまでで、とりあえずJupyter NotebookでOracleデータベースに接続することができるようになった。
その他の設定
分析用にpandasモジュールをインストールする。
# pip3 install pandas
Jupyter Notebookに他の端末からアクセスできるようにする。一時的にやりたいならこれでいけるらしい。
# jupyter notebook --ip=* --no-browser --allow-root
恒久的にやるなら設定ファイルを作成する。
# jupyter notebook --generate-config
設定ファイルの下記を書き換え。
c.NotebookApp.ip = '0.0.0.0'
実際にデータを取得してみる
pandasのデータフレームにcx_Oracle経由でデータを取得して表示する。
import cx_Oracle
import os
import pandas as pd
import pandas.io.sql as psql
# 文字化け対策
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"
user = 'データベースのユーザ名'
password = 'データベースのパスワード'
# DSNはtnsnames.oraの書式と一緒
dsn = '''
<data source alias> =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <hostname or IP>)(PORT = <port>))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = <database service name>)
)
)
'''
conn = cx_Oracle.connect(user=user, password=password, dsn = dsn)
sql = '''
ここにSELECT文を書く
'''
df = psql.read_sql(sql, conn)
pd.get_option("display.max_rows")
pd.set_option('display.max_rows', 1000)
df
名前:宮内 はじめ
Code for Nagoya名誉代表
E2D3名古屋支部長
プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。