PyHive を使って Hive カタログのテーブルに Presto クエリを実行する

Presto

Presto をさわり始めたのでプログラミング言語から簡単に操作したいと思い色々見てみたところ、Python では PyHive というパッケージがありました。

PyHive を使って Hive カタログのテーブルに Presto クエリを実行するまでをメモします。

Hiveテーブルの準備

適当にテーブルを作成しレコードを入れておきます。今回はhogeテーブルからvalue1を取得することが目標です。

hive> CREATE TABLE hoge
    > (fuga string);

hive> INSERT INTO TABLE hoge VALUES('value1');

hive> SELECT * FROM hoge;
OK
value1

PyHiveのインストール

以下のオフィシャル GitHub PyHive リポジトリのドキュメントを参考に実施。

GitHub PyHive リポジトリ:https://github.com/dropbox/PyHive

pip install pyhive[presto]

コードの作成

GitHub ページには DB-API を使用する際のために以下のようなサンプルがあります。

from pyhive import presto  # or import hive
cursor = presto.connect('localhost').cursor()
cursor.execute('SELECT * FROM my_awesome_data LIMIT 10')
print cursor.fetchone()
print cursor.fetchall()

が、ポートやカタログ・スキーマの指定方法がわかりません。早速ハマる。

ソースコードを見てみたところconnect() から Connection() を呼び出している模様です。接続先の指定はその先のCursor()でやっておりパラメータはそのまま渡しているようでした。portはデフォルトで 8080 が、catalogはデフォルトで hive が指定されるようです。以下、該当部分の抜粋です。

    def __init__(self, host, port='8080', username=None, catalog='hive',
                 schema='default', poll_interval=1, source='pyhive', session_props=None,
                 protocol='http', password=None):

ということですべてデフォルトで OK でしたが明示的に指定すると以下のような感じになります。

from pyhive import presto  # or import hive
cursor = presto.connect('localhost', port='8080', schema='default').cursor()
cursor.execute('SELECT * FROM hoge')
print cursor.fetchone()

結果も取得 OK。

$ python pyhive-sample.py
(u'value1',)

おわりに

ポートやカタログ等の指定部分に若干手間取りましたが簡単にクエリが実行できました。