PythonからImpalaにクエリを投げて結果を取得したかったので、方法を調べてました。
Impalaの環境はCloudera QuickStart VMを使用し、CDH4.3.0でImpala1.0.1です。
impylaというPythonのモジュールを試してました。
GitHub - laserson/impyla: Python client and Numba-based UDFs for Impala
Impalaとの通信はThrift経由になるので、thriftモジュールに依存しています。
接続先の指定は、BeeswaxというAPIサーバーのホスト名、ポート番号になるようです。
beeswaxの実行はimpaladのconfで設定できるみたいです。
デフォルトだと、21000番になってました。
impala-shellやHueはPythonで作られているみたいなので、これらを参考にしてもいいかもしれませんね。
Pythonの環境を用意してクエリを投げてみる
Impalaのチュートリアルにあるクエリを実行して結果を取得してみました。
Impala Tutorial
実行環境の用意
QuickStart VM上でvirtualenvを使ってPython環境を用意します。CentOS6に入ってるPythonをそのまま使ったので、今回はPython2.6.6。
$ sudo easy_install virtualenv $ virtualenv impyla-test $ source impyla-test/bin/activate (impyla-test)$ pip install impyla
test.py
import impala def main(): client = impala.ImpalaBeeswaxClient('localhost.localdomain:21000') client.connect() query = """SELECT tab2.* FROM tab2, (SELECT tab1.col_1, MAX(tab2.col_2) AS max_col2 FROM tab2, tab1 WHERE tab1.id = tab2.id GROUP BY col_1) subquery1 WHERE subquery1.max_col2 = tab2.col_2 """ results = client.execute(query) for record in results.data: print record if __name__ == '__main__': main()
ImpalaBeeswaxClientの引数にBeeswaxのホスト名、ポート番号を指定します。
問い合わせ結果のデータはdataプロパティに格納され、メタデータはschemaプロパティに格納されています。
実行結果
(impyla-test)$ python test.py 1 true 12789.123 3 false 24453.325
取得結果に対してデータ型の変換は行われないようなので、実際に使う際には、schamaの値と合わせて使う必要があるかもしれないです。
この辺、うまい方法があれば知りたいところです。引き続き調べてみようと思います。
2013/07/26追記
コメントより、HueのシェルからPythonでImpalaなどにクエリを投げる方法。
http://gethue.tumblr.com/post/49882746559/tutorial-executing-hive-or-impala-queries-with-python