python から dashDB をアクセスしたメモ


数値データ処理で主流になっている Python から IBM Watson Data Platform にグループされる dashDB for Analytics をアクセスする方法について試したメモです。

dashDBとは

dashDB は、「DB2 BLU」によるインメモリー・アナリティクスと PureData for Analytics (Netezza) 由来のイン・データベース・アナリティクスを融合し、クラウドサービスとして利用することを可能にしたアナリティクス・サービスです。IBM が提供するクラウド・プラットフォームである Bluemix 上で提供されています。
dashDB は、コアとなる分析エンジンに DB2 に搭載された BLU アクセラレーションを採用しています。BLU アクセラレーションは、IBM の基礎研究所の研究成果を元に開発された、まったく新しい SQL 処理エンジンです。DB2 for LUW の機能とメリットで紹介されているように、BLU アクセラレーションにはさまざまなイノベーションが詰め込まれています。そのなかでも特に重要なポイントは、分析処理につきものであったチューニングが不要になったことです。
BLU アクセラレーションを利用する上でユーザーに必要な作業はデータを投入することだけです。データ投入後はすぐに高速な分析ができます。これは、dashDB がクラウド上の分析サービスとして提供されるためにけして欠かせない要素です。逆の言い方をすると、チューニング不要な分析エンジンである BLU アクセラレーションが登場したからこそ、dashDB が実現できたとも言えます。そして、dashDB はサービスとして提供されており、初期投資やインフラの構築が不要で、迅速に利用を開始することが可能です。(1)

Pythonはアナリティックス用言語

Python には、数値データ処理用、高水準の科学技術計算用、機械学習用などのライブラリが提供されており、もしかしたら、R言語よりも、Pythonの方がアナリティックス用言語として、普及しているのではないかと思う程の情報があります。 (2),(3),(4)
そこで、Python から dashDB for Analytics を利用する方法について確認します。

Python & dashDB

Python から dashDBへ接続するには、ODBC と JDBC を利用できます。 設定に関する説明やドライバーダウンロード先のリンクは Bluemix の dashDBの管理画面にあります。

ODBC接続

次のスクリーンショットは、Bluemix の dashDB の管理画面の一つで、Connect を選んで、SSLを選択したところの表示です。 Python から ODBCドライバ経由で dashDBへ接続するには、ドライバをダウンロードしてインストールする必要があります。

ODBCドライバーのインストールと設定は、参考資料(8)が助けになると思います。ただし、DSN名は上記スクリーンコピーに相当するページに表示される名前を利用しないと接続できません。
下記のサンプルコードは、自分の MacBook の vagrant 環境で動作する Ubuntu14.04 の環境で動作するものです。

ODBC接続のサンプルコード
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# ODBC

from ibmdbpy.base import IdaDataBase
idadb = IdaDataBase(dsn="DASHDB", uid="******", pwd="***********")
print "current_schema = ", idadb.current_schema
idadb.close();
実行結果
ubuntu@ubuntu-xenial:~/dashDB$ ./test1.py 
current_schema =  DASH9824
Connection closed.

JDBC接続

前述のODBCドライバーをダウンロードすれば、JDBCドライバーも同梱されていますので、また、接続の設定は、参考資料(5)のサイトの http://pythonhosted.org/ibmdbpy/start.html#jdbc-connection にあり、JDBCドライバーは、参考資料(9)からもダウンロードできます。 こちらも同様に MacBook 上で動作する仮装サーバー Ubuntu14.04 で動作するコードです。

JDBC接続のサンプルコード
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# JDBC
from ibmdbpy.base import IdaDataBase

jdbc = 'jdbc:db2://dashdb-entry-yp-dal09-09.services.dal.bluemix.net:50001/BLUDB:user=dash982;password=**********'
idadb = IdaDataBase(jdbc)
print idadb.current_schema
idadb.close();

しかし、2017年6月1日現在、このコードは動作しません。 原因は JayDeBeApi のバージョンが上がった事によります。この問題は次のURLから参照できます。
RuntimeError: No matching overloads found. at native/common/jp_method.cpp:117 #18
https://github.com/ibmdbanalytics/ibmdbpy/issues/18

ibmdbpy の対話インタフェース

bmdbpyプロジェクトは、IBM dashDBおよびIBM DB2のデータベース操作アルゴリズムおよびデータ操作のためのPython 対話型インターフェースを提供します。Pythonで記述された操作を実行のために、接続されたデータベースにシームレスにプッシュすることで、Pythonの解析を加速し、これにより、列指向記憶および並列処理などのデータベース内性能向上機能の恩恵を受ける。 ibmdbpyプロジェクトは、Python開発者にとって、学ばなくても使うことができます。なぜなら、データ操作のためのPandasライブラリや機械学習アルゴリズムのScikit-learnライブラリの良く知られたユーザーインタフェースを真似ているからです。
ibmdbpyプロジェクトは、Pythonリリース2.7〜3.4 で利用できます。 ODBCまたはJDBCを介してdashDBまたはDB2インスタンスに接続できます。プロジェクトはまだ初期段階にあり、その多くの機能はまだ開発中です。しかし、いくつかの実験では、中規模または大量のデータ、つまり100万行以上のテーブルで操作する場合、パフォーマンス上のメリットが顕著であることが既に実証されています。(5)
Pandas のユーザーインタフェースは、10 Minutes to pandas http://pandas.pydata.org/pandas-docs/stable/10min.html を参照すると感覚的に理解できると思います。

ibmdbpy ライブラリのイントール

Python から dashDB を操作するためのライブラリとして ibmdbpy があり pip install で自分の実行環境に落とす事ができます。(5)(6)(7)

ubuntu@ubuntu-xenial:~/dashDB$ pip install ibmdbpy

ibmdbpy の実行例

下記の様に動作しますが、開発途上ということもあり、もう少し様子を見る必要がありそうですね。

ubuntu@ubuntu-xenial:~/dashDB$ python
Python 2.7.12 (default, Feb 15 2017, 05:35:22) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ibmdbpy.base import IdaDataBase
>>> idadb = IdaDataBase(dsn="DASHDB", uid="******", pwd="*******")
>>> idadb.ida_query("SELECT* FROM SAMPLES.CITSTATUS")
  䥃彔佃䕄                                               䥃彔䕄䍓
0    1                                   Born in the U.S.
1    2  Born in Puerto Rico/Guam/Virgin Islands/Northe...
2    3                  Born abroad of American parent(s)
3    4                                Naturalized Citizen
4    5                          Not a citizen of the U.S.

ibm_db によるSQL実行

Python用のibm_dbは pip install ibm_db で導入することができます。 検証したところ、DSN名で接続することに問題がある様でしたので、カタログを利用せず、接続用文字列でアクセスした処で、アクセスに成功しました。 日本語の入ったデータも問題なく利用できる様です。

#!/usr/bin/env python                                                                                                         
import ibm_db
url = "DATABASE=BLUDB;HOSTNAME=dashdb-entry-yp-dal09-09.services.dal.bluemix.net;PORT=50001;PROTOCOL=TCPIP;UID=******; PWD=*****;SECURITY=ssl"
sql  = "SELECT* FROM SAMPLES.CITSTATUS"
conn = ibm_db.connect(url, "", "")
stmt = ibm_db.prepare(conn, sql)
ibm_db.execute(stmt)
data = ibm_db.fetch_tuple(stmt)
while(data):
    print data[0], data[1]
    data = ibm_db.fetch_tuple(stmt)

ibm_db.free_stmt(stmt)
ibm_db.close(conn)

実行結果は、以下の様になり、普通のODBCによるアクセスと同じです。

ubuntu@ubuntu-xenial:~/dashDB$ ./test5.py
1 Born in the U.S.
2 Born in Puerto Rico/Guam/Virgin Islands/Northern M
3 Born abroad of American parent(s)
4 Naturalized Citizen
5 Not a citizen of the U.S.

まとめ

Bluemix の dashDB for analytics を Python でアクセスしてみました。 ibmdbpy プロジェクトは、Pandasと互換のあるUIを適用するもので、期待が大きいのですが、開発初期段階ということもあり、これからの成果を見守りたいと思います。 それから、レガシーな ibm_db の Python版は安定の動作でスグに使えますね。

続編 python dashDBをアクセスするコードの作り方 on Blumix or local もあります。

参考資料

(1) さわってみよう dashDB https://www.ibm.com/developerworks/jp/data/library/dashdb/dm-dashdb1-bluemix/
(2) Python でデータサイエンス http://pythondatascience.plavox.info/
(3) なぜ機械学習にPythonが選ばれるのか http://qiita.com/yaju/items/5502115d7e3d06e6bbdd
(4) Scipy Lecture Notes http://www.turbare.net/transl/scipy-lecture-notes/index.html
(5) ibmdbpy Accelerating Python Analytics by In-Database Processing http://pythonhosted.org/ibmdbpy/index.html
(6) Python package index ibmdbpy 0.1.4 A Pandas-like SQL-wrapper for in-database analytics with IBM dashDB/DB2. https://pypi.python.org/pypi/ibmdbpy
(7) GitHUB ibmdbanalytics/ibmdbpy https://github.com/ibmdbanalytics/ibmdbpy
(8) Bluemixでデータ分析「dashDB」:LinuxサーバにODBCの設定してみた http://qiita.com/azzeten/items/55dc4ad1535bf709403b
(9) DB2 JDBC Driver Versions and Downloads http://www-01.ibm.com/support/docview.wss?uid=swg21363866
(10) ibm_db 2.0.7 https://pypi.python.org/pypi/ibm_db/