Google の SQL parser/analyzer の ZetaSQL とは何であるか

apstndb
google-cloud-jp
Published in
7 min readMay 14, 2019

--

2019年4月に Google の SQL parser/analyzer の ZetaSQL が公開されました。

現在 BigQuery Standard SQL や Cloud Spanner で実装されている SQL 方言であり、 Cloud Next 2019 で BigQuery UI から Cloud Dataflow で実行されるパイプラインを記述できる機能として発表された Cloud Dataflow SQL にも使われることがツイートからも見て取れます。

ZetaSQL については Google の外の人がまともに言及しているのを見たことがなく、聞いたことがないか様子見という人が多いと思うので分かっていることを書いていきます。

既存の文献から見る素性

ZetaSQL は Spanner の SQL 実装について書かれた Spanner: Becoming a SQL System の “6. COMMON SQL DIALECT” に次のように書かれている “GoogleSQL library” そのものであると考えられます。

To ensure consistency between systems, several shared components were built as a collaboration between teams, referred to internally as the GoogleSQL library

GoogleSQL library を構成するコンポーネントについては論文中にも記載がありますが、実際に google/zetasql として公開されているものと比較してみましょう。

The first shared component is the compiler front-end. This component performs parsing, name resolution, type checking, and semantic validation.

ZetaSQL の説明を見れば含まれていると考えられます。

The second shared component is a library of scalar functions.

zetasql/public 以下に見つかる BigQuery や Cloud Spanner の組み込み関数の実装と対応すると考えられます。

The third component is a shared testing framework and shared tests.

README.md に OSS 化のロードマップがあるコンポーネントとして記載されています。

3. Compliance Tests

- includes framework for validating compliance of arbitrary engines

更に、この論文には次のような記述があります。

Spanner’s SQL engine shares a common SQL dialect, called “Standard SQL”, with several other systems at Google including internal systems such as F1 [9] and Dremel [7] (among others), and external systems such as BigQuery.

SQL 方言の実装である ZetaSQL は GCP のサービスとしての Cloud Spanner や BigQuery だけでなく、 Google の社内インフラとしての Spanner や Dremel の SQL エンジンに使われていると考えられます。

更に、 F1 で使われているという記述がありますが、 F1 Query: Declarative Querying at Scale に書かれた記述とも一致するため Google の社内システムである F1 Query でも使われていることが分かります。

[12] describes the shared SQL dialect used by F1 Query, Dremel [51]/BigQuery [3] and Spanner SQL [12], allowing users and applications to move between these systems with minimal overhead.

ZetaSQL のドキュメントを見ると、 BigQuery と Cloud Spanner のどちらにも存在しない機能(PROTO, Table-Valued Function & Aggregate UDF)などが多く見つかりますが、これらの論文にも書かれているように Google の社内システムで使われている機能であるという認識で良いでしょう。

ユースケース

ZetaSQL は実際に Google の中で使われているフロントエンドに必要なものの多くを含んでいるため、 Cloud Spanner や BigQuery の SQL を処理するツールの実装に使うことができます。しかし、 ZetaSQL は C++ で実装されているのでややハードルが高いでしょう。

試しに Cloud Run で実行可能なフォーマッターである zetasql-format-server を単純に parser と unparser の組み合わせで実装してみました。cgo でリンクするために ZetaSQL をフォークして visibility を変更したものを使っていますが、ライブラリとしての使い方がある程度イメージできるのではないでしょうか。

この実装では AST にはコメントが保存されないのでコメントが削除されているものの、tokenizer で取得したコメントの位置情報と合わせればコメントを保持するフォーマットも実装できそうです。

フォーマッターの他のユースケースとしては、 SQL の静的解析やトランスレーター、バックグラエンドの実装が必要なので難易度が高いですが、 Cloud Spanner/BigQuery のエミュレーターなども考えられます。

いかがでしたか?

追記

なお、 ZetaSQL の元々の名前だと考えられる GoogleSQL はライブラリ名としてだけでなく Standard SQL と呼ばれている方言の社内名称として使われていることが “GoogleSQL DremelSQL” の検索結果から予想できます。DremelSQL(Legacy SQL), GoogleSQL(Standard SQL) をインターン等の職歴に書いている人が多いですね。

私も今後 BigQuery Standard SQL と Cloud Spanner SQL といった ZetaSQL が実装している方言の総称として GoogleSQL を使おうと思っています。

追記(2019年5月17日)

Cloud Dataflow SQL のアルファ版がパブリックリリースされました。Introduction to Cloud Dataflow SQL には次のような記述があり、 方言名としての GoogleSQL を置き換える形で ZetaSQL query syntax が使われていると読み取れます。

Cloud Dataflow SQL integrates with Apache Beam SQL and supports a variant of the ZetaSQL query syntax.

現時点ではアルファなため変更の可能性がありますが Cloud Dataflow SQL streaming extensions には GitHub 上の ZetaSQL には記述がない、 Apache Beam のウィンドウ定義のための関数が書かれています。Streaming SQL が ZetaSQL という1つの方言の中でサポートされていくのであれば、将来的にはこれらが ZetaSQL にマージされるという未来もあるかと思われます。

なお、実行時の表示を読むと ZetaSQLQueryPlanner という形で ZetaSQL 方言を Apache Beam SQL エンジンで処理できるように実装しているようです。Apache Beam SQL では従来 Apache Calcite を使っていましたが、 [BEAM-5644] Plugable Planners が Cloud Dataflow SQL の伏線であったことが分かりますね。

--

--