Presto Viewとかその辺の話を書いてみる

以前Hiveでの集計処理とかPrestoについての話を
PrestoとかAnsibleとかその辺の話を軽く書いてみる - wyukawa’s blog
で書いたのですが、今はこんな感じでやっているよーという話を書きます。

最近やっていることは、

  • Presto CLIでデータの中身を確認しつつHiveQLを書いてETL処理を作る。
  • Hiveでの集計結果はHiveテーブルでそれを見やすいようにPresto Viewを作る。作らない場合もある。
  • HiveテーブルもしくはPresto ViewをPrestogres経由でBIツールで表示する。

という感じです。

例えばOS別、国別のPV, UUを求めたい場合なんかは下記のようにHiveQLを書いています。

SELECT
  '2014-08-24', os, country, COUNT(*), COUNT(DISTINCT userid)
FROM
...
GROUP BY
  os, country
WITH CUBE

そうすると結果は下記のような感じになります。WITH CUBEを使うことによってos別、country別集計結果以外にもos別集計結果(iOSのpv, uuとか)、country別集計結果(JPのpv, uuとか)、全体でのpv, uuといった値を求めることができます。列でNULLになっているところが部分和、総和の部分です。os, countryのそれぞれのカラムにNULLがあると紛らわしいのでそこは空文字に置換したりしてます。

date os country pv uu
2014-08-24 iOS JP 100 30
2014-08-24 Android JP 200 70
2014-08-24 Android US 300 80

...

2014-08-24 NULL JP 200 70

...

2014-08-24 iOS NULL 1000 300
2014-08-24 Android NULL 2000 700

...

2014-08-24 NULL NULL 10000 7000

このままBIツールからレポーティングしてもいいんですが、縦持ちを横持ちにして下記のように表示したいというケースもあるのでそういう場合はPresto Viewを作って、Prestogres経由でBIツールで表示しています。

date iOS_pv Android_pv total
2014-08-24 1000 2000 3000

Hive ViewだとPrestoからアクセスできない、つまりPrestogres経由でBIツールで表示できないのでPresto Viewを作っています。

PrestoでViewを作成するとその情報はconnector側のメタストアに保存されます。Hiveの場合はHiveのメタストアに保存されます。ソースをチラ見した限りだとViewDefinitionというオブジェクトをJSONシリアライズしたものをbase64エンコードして「/* Presto View: 」と「 */」でかこって保存しているようです。コメントとして保存しているという感じのようです。なのでHiveからPresto Viewの中身を見ることは出来ませんが、Hiveでshow tablesするとPresto Viewも表示されます。

そんな感じでやってますが、今のところPrestoで障害が起きたということはありません。PrestoのJMXの項目のいくつかとJVMをモニタリングしてますが、特に変わった挙動もありません。まあ障害が無いのでほとんど見てないというのが実態です。

データをGUIで見るためにいくつかツールも試したのですが、SQL Workbench/JとSQuirreLはなんかうまくいかずDbVisualizerはうまくいきました。Presto CLIだけでもなんとかなるとは思います。

まあ、そんな感じです。