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

/var/log/laughingman7743.log

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

Amazon AthenaのPythonクライアント書いた

AthenaがAPI/CLIに対応した*1ので boto3*2で少し使ってみたのですが、クエリ実行結果のパースが非常にめんどくさい。
もっとカジュアルにクエリを投げたいなってことで、PEP249*3に準拠したクライアント書きました。

使い方はJDBC*4と変わらないです。コードもほとんど流用する形です。
ポーリング中のリトライ処理は実装した方が良かったかも。。。
asyncio*5対応とかしたいですね。

Enjoy!

PyAthenaJDBCでRedashのクエリランナー書いてみた

redash-athena-proxy*1を使ってRedashからAthenaにクエリを投げれる環境を作っていたのですが、どうもtimestamp型やdate型の戻り値が日付として上手く認識しない。。。
おそらくproxy側のGSONの日付型のシリアライズ設定の問題かと思われるのですが、調べるのだるい、proxyのような外部プログラムを別に立てるのやめたい、かつ自分で作ったライブラリ*2でクエリランナーが簡単にかけそうだったので書いてみました。(ほとんどPrestoのクエリランナーのコピペですが)

Docker環境で運用してるので以下の様にベースのイメージにOpenJDK等を入れたイメージを作成しています。(あまりイメージのスリム化とかは意識していないのであしからず)
環境変数REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.athena の設定を忘れずに。以下のDockerイメージであれば、必須項目の設定だけでAthenaにつながります。 (インスタンスのIAMロールにも対応してるのでアクセスキーの設定は必須ではなかったりするのですが、もろもろ事情があって必須設定にしています)

S3のデータを雑に検索できるのは非常に便利なのですが、いかんせん遅い。。。ORC+Snappyでも遅い。。。とにかく遅い。。。
速度面でBigQueryに対抗できるプロダクトになってくれると良いですね。

Enjoy!

S3DistCpをリモート実行したい

S3DistCp*1をよく使うのですが、 複数のS3DistCpを実行する場合、クラスタにステップを追加する形だと1ステップづつシーケンシャルに実行され、かなり待たされることになります。 ステップを追加する形ではなく、SSHでリモート実行できると任意のタイミングで実行できて良さそうだなと思い、Paramiko*2を使って実装してみました。結構簡単に実装できますね。

Enjoy!

PythonからAmazon AthenaにJDBC接続するラッパー

暇を持て余していたので作ってみました。
バージョン番号は諸事情により1.0.1となってしまいました。(心温かみのある手作業でのリリースはまずい。。。)

既知の問題点
  • Decimal型をフェッチすると落る
    ドライバのバグのようです。フォーラムにも上がってました*1
  • クエリのキャンセルができない
    クラスファイルを見る限り、現在の実装だとクエリのキャンセルはできないっぽい。

AthenaのJDBCドライバのライセンスが不明なので、再配布(whlファイルにはJARが含まれます)とかまずかったりするかも。。。
まずい場合はご連絡いただければ。

Enjoy!

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!

Hiveでカレンダーテーブルを簡単に作る

集計処理でカレンダーテーブルがあると何かと便利なのでカレンダーテーブルを作りたいなと思ったのですが、HiveにはPostgreSQLのgenerate_seriesのような関数がない。。。
UDFなら作っている人がいそうな気がしたので調べてみると、Hivemall*1のUDFにgenerate_series関数*2があるのでそれを使って作ります。

Hivemallの使いどこはそこじゃない感がありますが、簡単にカレンダーテーブルが作れます。 カレンダーテーブルをベースにJOIN、nvl(Prestoだとnullif)を使えば、window関数で抜けた日付があっても安心ですね。

HivemallはSQL機械学習とかできたりして何気にスゴイのでは。SQLで完結できるのでかなりおっさん向けな感じかなと思ったり。

Enjoy!

Feedlyではてなブックマーク数が表示されなくなったので雑に直した

オリジナルは以下です。

Feedly 移行記念、Feedly をはてブ対応させるユーザースクリプト – OTCHY.NET

Enjoy!