以前の記事「PandasデータフレームとGridDBの組み合わせ方」で、 Using Pandas Dataframes with GridDB という記事を説明しました。 そこでは、Python API(裏ではTQLを使用)を介してGridDBデータベースから読み込み、結果のデータ行をデータフレームに変換しました。 データフレームに馴染みのない方のために説明すると、データフレームはPandasのようなライブラリを使用する主な目的であり、分析やデータサイエンスに最適なデータ構造であると言えます。
本稿では、GridDBデータの行をデータフレームに変換する方法について再度説明しますが、コードのクエリ部分ではJDBCを使用したSQLの使用例も紹介したいと思います。TQLではなくSQLを使用したい理由は主に2つあります。
- TQLの機能が限られているため、SQLを使用した方が複雑なクエリを実行できる
- TQLではパーティショニングされたテーブルを読み取れない場合があり、その場合はSQLが唯一の選択肢となる
そこで、本記事では、Python を使用して GridDB に接続し、SQL クエリを実行する方法、およびその結果を pandas データフレームに直接取り込む方法をご紹介します。 なお、以前の記事「Using Python to interface with GridDB via JDBC with JayDeBeApi」でご紹介した JayDeBeApi を使用するのではなく、Python を使用する方法をご紹介するのは、それらの SQL クエリの結果は pandas で読み取れる有効なデータ型ではないためです。
前提条件
この記事のコードはDockerコンテナにコンテナ化されています。実行するには、Dockerをインストールし、プロジェクトをビルドして実行するだけです。ソースコードはGridDBnetのGitHubにあります。
$ git clone https://github.com/griddbnet/Blogs.git --branch sql-pandas
このコードをベアメタルで実行する方法については、リポジトリに含まれるDockerfileを参照してください。基本的には、Pythonと適切なSQL/pandasライブラリをインストールするだけです。また、JDBC(Java Database Connection)で接続を行うために、Javaもインストールする必要があります。
Python ライブラリ
前述の通り、pandasの read_sql
メソッド呼び出しにデータを供給できる行データを作成する JDBC Python ライブラリを見つけ、使用する必要があります。Pandas のドキュメントによると、read_sql
メソッドに供給する接続は、「ADBC 接続、SQLAlchemy 接続、文字列、または sqlite3 接続」のいずれかでなければなりません。
もちろん、JayDeBeApiは除外されますが、私たちは、JDBC経由で接続できるあらゆるデータベースへの汎用的な接続を可能にする、人気の高いSQLAlchemyライブラリのフォークを見つけることができました。そのライブラリはこちらで見つけることができ、この前提全体が機能するようになります。それ以外にも、もちろん、データ分析を行うにはpandasとnumpyライブラリも必要になります。
SQLAlchemy を使用した SQL 接続の作成
SQLAlchemy のドキュメント(JDBC Generic: https://pypi.org/project/sqlalchemy-jdbc-generic/)と GridDB JDBC のドキュメント(GridDB JDBC: https://github.com/griddb/docs-en/blob/master/manuals/GridDB_JDBC_Driver_UserGuide.md によって、JDBC 接続文字列の適切な作成方法を確認することができました。繰り返しますが、これは JayDeBeApi ライブラリを使用して接続文字列を作成するのとは異なるプロセスであることに注意してください。テーブルを設定したので、以下にその接続文字列の作成方法を示します。
from sqlalchemy.engine.url import URL
eng_url = URL.create(
drivername='sqlajdbc',
host='/myCluster/public',
query={
'_class': 'com.toshiba.mwcloud.gs.sql.Driver',
'_driver': 'gs',
'user': 'admin',
'password': 'admin',
'notificationMember': 'griddb-server:20001',
'_jars': '/app/lib/gridstore-jdbc-5.6.0.jar'
}
)
まず、ドライバ名は「sqlajdbc」に設定する必要があります。これは、汎用JDBCドライバの名前です。次に、接続順序は少し逆に見えますが、これがURLを構築する正しい方法です。もう1つ、_jars
オプションはライブラリJARを必要としますので、GridDB JDBC jarファイルを保存した場所を指すようにパスを設定してください。同梱のDockerfileを使用している場合は、すでに正しいパスが指定されています。
この接続を試みる際に最後に注意すべき点は、接続の詳細を入力してGridDBへの接続を試みる前に、次のようにJVM(Java仮想マシン)を起動する必要があることです。
import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=/app/lib/gridstore-jdbc-5.6.0.jar")
この情報をすべて設定したので、接続を行い、データフレームに保存するいくつかのクエリを実行することができます。
from sqlalchemy import create_engine
eng = create_engine(eng_url)
with eng.connect() as c:
print("Connected")
df = pd.read_sql("SELECT * FROM LOG_agent_intrusion WHERE exploit = True", c)
print(df.head())
ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb