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

/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

PythonでAmazon Athenaにつなぐ

Amazon Athena*1への接続は現状JDBCしかサポートされていない。。。やっぱりPythonからつなぎたいですよね!
PythonからJDBCでつなぐには、Py4J*2やJPype*3あたりを使うと良さそうですが、Py4JはJavaでGatewayServerを作成し、別プロセスで起動しなければならないので少しめんどくさいです。Jythonはちょっと。。。
JPypeを使ったJayDeBeApi*4というJDBCラッパーがあるのでそれを使ってつないでみます。(Jythonでも動くようです)

が、そのままではAthenaで接続時のパラメータ設定で必須な s3_staging_dir の設定ができません。 プルリクを見てみると、接続時のパラメータを設定できるようなプルリクがあるので、そちらを使ってつないでみます。

ががが、つないてみるとエラーが出ます。エラー内容を見ると、どうもAthenaのJDBCドライバはプリペアドステートメントをサポートしていないらしいです。 JayDeBeApiは__init__.pyファイル1つだけなので、適当に眺めて必要な箇所を修正してみます。別メソッドを定義しても良かったのですが、プリペアドステートメントを使用しない形に修正してみたのが以下です。

これでようやくつなげます。簡単にスキーマ一覧を取得してみます。

Jarファイル等は以下のようなディレクトリ構成に配置して実行しています。(JPypeのみ pip install jpype1 でインストールしています)

JPypeでももちろんJavaの環境は必要です。 OSXで実行する場合はレガシーJava 6ランタイム*5も必要なようです。

問題点はJayDeBeAPIがアクティブなプロジェクトではないのと(JPypeもSourceforge*6からforkしたプロジェクトはあまりアクティブなプロジェクトではない)、structやarray型が文字列として取得される(JdbcTypeに対応した変換用のメソッドを作ってやれば対応できそう)あたりでしょうか。

re:dashの中の人はAthena用のプロキシを立て、RESTで叩く形にするようです。

AWSオフィシャルでPythonからの接続もサポートされると良いですね。

Enjoy!