読者です 読者をやめる 読者になる 読者になる

PythonからCloudera Impalaにクエリを投げて結果を取得する

Python Impala

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