Secret Ninja Blog

プロダクトマネージャーしてます

FlowスタイルのSQL言語wvletをTrinoと一緒にちょっと試す。

最近、某taroleoさんが何やら新しい言語を作っていて、試せるようになったので使ってみる。

SQL自体は極めて便利で一般的に使われるようになったが、言語の構文が分析目的で使う上では直感的ではなく、また各種クエリエンジン毎の方言も多く、記述方法の最適化が難しいことが多い。

wvletは、この問題を解決するFlowスタイルのSQL言語であり、DuckDB, Trino, Hiveなどの種々のクエリエンジンの抽象レイヤーとして利用ことができるようになっている。似たようなソフトウェアだとGoogleがSpannerなどで使えるGoogleSQLがそれに近い。

また、フロースタイルのSQLは、いわゆるBIとかで使われるようなデータソースを選び、フィールドを選び、フィルタリングをし、といった直感的なオペレーションを行うことができる仕組みっぽい。

兎にも角にもインストールをしてみる。

brew install wvlet/wvlet/wvlet

今はDuckDBとTrinoに対応しているので、TDのTrinoに繋いで試してみた。

例えば単純に

SELECT * FROM www_access limit 10

も下記のような形で

www_accessを呼び出して10件という、上から下への流れる形で記述が行える。

wv> from www_access
  │ select path, host
  │ limit 10;
┌────────────────────────────────────┬────────────────┐
│                path                │      host      │
│               string               │     string     │
├────────────────────────────────────┼────────────────┤
│ /category/jewelry                  │ 212.201.217.44 │
│ /item/software/1134                │ 188.162.87.188 │
│ /category/finance                  │ 204.36.47.69   │
│ /search/?c=Electronics+Electronics │ 24.135.92.177  │
│ /category/computers                │ 64.30.110.187  │
│ /category/electronics              │ 56.69.104.165  │
│ /category/software                 │ 32.162.147.140 │
│ /item/books/1894                   │ 52.75.79.113   │
│ /search/?c=Electronics             │ 68.42.225.106  │
│ /category/software?from=10         │ 180.195.206.36 │
├────────────────────────────────────┴────────────────┤
│ 10 rows                                             │
└─────────────────────────────────────────────────────┘

こういった流れが行えることで何が嬉しいかというと、小さな分析バッチを書くようなケースにおいて、分析SQLが長大になると、SELECT * FROMの入れ子が増え、どこまでの処理がどこにあるのかの可視化が非常に難しくなる。

しかし、フロースタイルになることによって、処理の記述については上から下に行くだけになり、分析の途中結果なども含めて可読性が非常に高くなるというメリットがある。

wv> from www_access
  │ -- select path, host
  │ group by host
  │ agg _.count as host_count
  │ limit 10;
┌─────────────────┬────────────┐
│      host       │ host_count │
│     string      │    long    │
├─────────────────┼────────────┤
│ 156.147.155.124 │          3 │
│ 44.174.50.77    │          8 │
│ 228.123.91.138  │          4 │
│ 28.228.139.98   │          1 │
│ 128.141.57.79   │          9 │
│ 148.141.110.68  │          8 │
│ 80.66.64.110    │          7 │
│ 128.72.44.82    │          4 │
│ 20.180.38.218   │          4 │
│ 172.207.112.61  │          6 │
├─────────────────┴────────────┤
│ 10 rows                      │
└──────────────────────────────┘

例えば上記では、最初にpath, hostをみて、そのあと集計を行うといったときに、その前の処理はコメントするなどといった色々手続きの簡略化なども行いやすい

今後の開発状況は下記のgithubを見てみると良い。

github.com