6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Prestoの新しい関数まとめ (v0.153 ~ v0.173)

Posted at

Prestoの0.152.3がSep 28, 2016にリリースされてから半年ほどで0.173になりました。
(ちなみにTreasureDataのPrestoのバージョンは0.152.3 (2017年4月12日時点)なので、現時点では下記機能は使えません。バージョンはこちらを参照)
さて、0.153~0.173までの間でリリースされた中の新しく追加された関数について見ていきたいと思います。
https://prestodb.io/docs/current/release.html

関数系

Add levenshtein_distance() function

二つの文字列間のレーベンシュタイン距離を調べる。類似度検索みたいなことができるようにになる。

select levenshtein_distance('xxx','xyx')
-> 1

Add shuffle() function for arrays

配列の要素をランダムに並び替えてくれる。(ユースケースがいまいちわからない・・・

SELECT 
  shuffle(x)
FROM (
  SELECT 
    ARRAY['xxx','xyx', 'xzy', 'aaa'] AS x
) t

Add a variant of from_unixtime() function that takes a timezone argument.

from_unixtime(unixtime) -> timestamp
だけだったのが
from_unixtime(unixtime, xxxx) -> timestamp with timezoneがサポート。これはちょっと嬉しい。

-- 1491922800 = 2017/04/12 00:00:00 JST

SELECT from_unixtime(1491922800) => 2017-04-11 15:00:00.000
SELECT from_unixtime(1491922800, 'Asia/Tokyo') => 2017-04-12 00:00:00.000 Asia/Tokyo
SELECT from_unixtime(1491922800, 9, 0) => 2017-04-12 00:00:00.000 +09:00

Add bitwise_and_agg() and bitwise_or_agg() aggregation functions.

そもそもbitwiseを使っているのを見たことがないので、略。
https://prestodb.io/docs/current/functions/bitwise.html

Add from_big_endian_64() function

引数がbinaryなので、略

Add xxhash64() and to_big_endian_64() functions.

同上だけれども動かそうと思うと、to_utf8を使ってhash化できたりする。

SELECT xxhash64(to_utf8('aiueo'))
=> 42 34 03 ba 0b 4e 2c c3

Add codepoint(), skewness() and kurtosis() functions.

codepoint()は。。。略。

skewness()kurtosis()は、歪度と尖度を算出する関数。
ここら辺がわかりやすいが、http://support.minitab.com/ja-jp/minitab/17/topic-library/basic-statistics-and-graphs/summary-statistics/how-skewness-and-kurtosis-affect-your-distribution/
まあ統計とかしてない人には関係ないので略。

Add arrays_overlap() and array_except() functions.

arrays_overlapは、二つの配列の要素のうち1つでも同じかどうかを判別(論理演算のANDが一つでもあるか)。一つでも同じならTrue, 違ければFalse。

array_exceptは、二つの配列で、aの配列の要素のうちbの配列の要素を除外した配列を返してくれる。ただし、重複も除去されます。

SELECT array_except(a,b)
FROM (
  SELECT
    ARRAY['a','c','c'] as a,
    ARRAY['a','b'] as b
) t
=> ["c"]

Add support for quantified comparison predicates: ALL, ANY, and SOME.

https://prestodb.io/docs/current/functions/comparison.html#quantified-comparison-predicates-all-any-and-some
こんな評価構文ってあるんだ、知らなかった・・・っていうのが本当のところですが、面白いですね。
当然のことながらWHERE句でも使えるので、条件指定がシンプルに表現できそうですね。

SELECT 42 >= ALL (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43)
=> false
SELECT 42 >= ANY (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43)
=> true

Add Lambda Expressions and Functions

ラムダ式のサポート。。。ラムダ式はまじでみるのがつらい。これをゴリゴリ使われて、パフォーマンスチューニングとか依頼されたら涙目になりそうではある。

ただARRAYの操作なんかは便利そうで、例えば、下記のようなARRAYの内容をNULLを0埋めしてからSUMさせるような集計なんかは簡単にできてよさそう。

SELECT reduce(ARRAY [5, 20, NULL, 50], 0, (s, x) -> s + COALESCE(x, 0), s -> s);
=> 75

まとめ

リリースノートを眺めていると、パフォーマンス改善系が多く、そろそろSQL構文レベルでの追加はだいぶ減っているように見受けられる(相関サブクエリとかがまだ完璧じゃないが徐々にサポートしているっぽい)。とはいえ関数は引き続き増えているのでやはり便利。(思ったよりは多くなかったが、半年で関数だけでこれだけ増えているですごい)

また、PrestoのRoadmapを眺めると、https://github.com/prestodb/presto/wiki/Roadmap
GROUPINGとGeoSpatial functionが関数としては今後嬉しいところですね。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?