Prestoについていくつかメモ

最近バージョンアップ頻度が上がって以前は月一ぐらいだったのに最近は週一以上の頻度でバージョンアップしているPrestoについて適当に書いてみます。

\GとLAST_DAYに関してはfrsyukiさんに教えてもらいました!


\G

カラム数が多いテーブルをselectすると横に切れちゃう時がありますが、そんな時はMySQLと同じように\Gを使って縦表示できます。

presto:default> select 'a', 'b';
 _col0 | _col1
-------+-------
 a     | b
(1 row)
presto:default> select 'a', 'b'\G;
-[ RECORD 1 ]
_col0 | a
_col1 | b


LAST_DAY

月末を取得するLAST_DAYという関数がMySQLにあります。

SELECT LAST_DAY('2014-11-01')
=>2014-11-30
SELECT LAST_DAY('2014-11-02')
=>2014-11-30

同様のことをPrestoでやろうとするとこんな感じになります。月初にして1月分足して1日分引きます。

presto:default> select date_format(date_trunc('day', ((date_parse(date_format((timestamp '2014-11-01'), '%Y-%m-01'), '%Y-%m-%d') + INTERVAL '1' MONTH) - INTERVAL '1' DAY)), '%Y-%m-%d');
   _col0
------------
 2014-11-30
(1 row)

presto:default> select date_format(date_trunc('day', ((date_parse(date_format((timestamp '2014-11-02'), '%Y-%m-01'), '%Y-%m-%d') + INTERVAL '1' MONTH) - INTERVAL '1' DAY)), '%Y-%m-%d');
   _col0
------------
 2014-11-30
(1 row)


SHOW CREATE TABLE
HiveのSHOW CREATE TABLE相当のものはPrestoに無いと思います。

なのでDDLは別途保存しておいた方が良いと思います。まあこれはHiveでもそうだと思います。

うっかりDDL保存し忘れた場合はhive側で「desc formatted Prestoビュー名」してView Original Textの「/* Presto View:」から「*/」までの部分をbase64デコードすればDDL見れると思います。

Prestoはストレージを持っていなくてその代わりHiveのメタストアにPrestoビューなどの情報を保存しています。


累積

Prestoにはウィンドウ関数がありますがsumがありません。なので累積を出すのはちょっと難しいと思います。

ちなみに累積を求める方法は下記3通りあると思います。

1.相関サブクエリ
2.分析関数
3.自己結合

で、僕が試した限りでは状況としては以下のような感じでした。詳細は忘れました!
・Hive
1と3は未サポートで2は何故か動かない。
・Presto
1,2,3全部未サポート
MySQL
2は未サポートで3はクエリ返ってこない。1は試してないけどたぶん3と同じ。


implicit join

Prestoだと下記のようなクエリを書くと「Implicit cross joins are not yet supported; use CROSS JOIN」と言われてエラーになります。

select
...
from
  fact f, dimension d
where
  f.key = d.key
...

以下のように書けば動きますが、BIツールからPrestoにつなぐ場合はクエリを調整できないことがあると思います。

select
...
from
  fact f
join
 dimension d
on
  f.key = d.key
...

なので、ちょっと困っていたのですが、
https://github.com/facebook/presto/commit/a2b6dbc371a3132510544d5284334f646ef8e561
を見ると0.80でimplicit joinをサポートするようです。やったね!