About Me

My photo
Software Engineer at Starburst. Maintainer at Trino. Previously at LINE, Teradata, HPE.

2022-12-24

Trino 2022 recap

Trinoで2022年に追加された新機能を紹介します。他にも多くの機能が追加されていますがメジャーなものに絞りました。

Polymorphic table functions

Polymorphic table functionsは聞き慣れないかもしれませんが、スカラー関数とは違って複数の行や列を返却できる関数のことです。例: SELECT * FROM TABLE(my_function(1, 100));
テーブルを引数に取れないなど内部的にはまだ未実装の部分もありますが、クエリをパススルーする関数がJDBC系コネクター、Elasticsearch, BigQueryおよびMongoDBが実装しています。関数の性質上、クエリをリモートに実際に実行する前に結果のカラム名とタイプを取得する必要があります。JDBCはPrepared StatementでResultSetMetaDataから取得、Elasticserachは取得が難しいので現状は1カラム1レコードにJSONを詰め込む形の実装、BigQueryはクエリをdry runして取得、MongoDBは内部的に管理している_schemaコレクションから取得といった流れになっています。
JDBCコネクターを使用する人が多そうなのでもう少し内部的な実装を説明すると、ResultSetMetaDataを取得する必要があるのでDDLなどは基本的にはサポートされていません。"基本的には"と書いたのはJDBCドライバの実装依存だからです。DDLに関してはTable functionではなくProcedureで実装される予定です #12322。次に内部的には完全にパススルーしている訳ではなくSELECT * FROM (...) oのようにラップしています。そのため対象のデータベースが生成されたクエリを実行できない場合もあります。例えばSELECT * FROM (SHOW DATABASES) oなどはエラーになるDBが多いでしょう。これらはあくまでデフォルトの実装 (DefaultQueryBuilder)なのでコネクターを自身で開発されている方は適宜変更することも可能です。

関連リンク

JSON functions

元々JSON関連の関数は存在しましたがJSON pathがサポートされ、これまでよりシンプルに複雑なJSONを分析することが可能になりました。
JSON pathを使用したjson_exists関数の例を説明します。以下のようなテーブルがあったとします。
 id  |                    description
-----+---------------------------------------------------
 101 | {"comment" : "nice", "children" : [10, 13, 16]}
 103 | {"comment" : "knows best", "children" : [2]}
 102 | {"comment" : "problematic", "children" : [8, 11]}

childrenフィールドの配列内に10より大きい数が存在するかを確認するためにはlax $.children[*]?(@ > 10)というパスを使用できます。
SELECT
      id,
      json_exists(
                  description,
                  'lax $.children[*]?(@ > 10)'
                 ) AS children_above_ten
FROM customers;

 id  | children_above_ten
-----+--------------------
 102 | true
 103 | false
 101 | true

関連リンク

MERGE statement

ANSIで定義されているシンタックスなので文法に関する説明は割愛しますが、MERGE statementが追加されました。現時点では以下のコネクターでサポートされています。
  • Hive
  • Iceberg
  • Delta Lake
  • Kudu
  • Raptor
MERGE statementの他にはCOMMENT ON VIEWや、カラムの型を変更するALTER TABLE ... ALTER COLUMN ... SET DATA TYPEが今年は追加されました。


Fault-tolerant execution

Trinoはアドホックな分析やBIツールで使用されることが多いのですが、ETLの使用にも耐えられるよう開発が始まったのがFault-Tolerant Execution (Project Tardigrade)です。リトライのポリシーにはQUERYとTASKの2種類があります。QUERYは失敗時にクエリ全体、TASKは個々のタスクレベルでリトライを行います。大きめなETLワークロードの環境では外部ストレージに中間結果を書き込むExhange managerを有効にしてTASKリトライポリシーを使用することが推奨されています。現在サポートされているコネクターは以下の通りでBigQuery向けの開発が現在進んでいます。

  • Delta Lake
  • Hive
  • Iceberg
  • MySQL
  • PostgreSQL
  • SQL Server
  • MongoDB
関連リンク

New connectors

2022年は新たにDelta LakeMariaDBおよびHudiコネクターが追加されました。Delta LakeコネクターはStarburstで元々開発されていたものがオープンソース化されました。MariaDBコネクターについては以前はMySQL/SingleStore (MemSQL)コネクターを使っている方が多かったのですが、Compatibilityの乖離も徐々に進んできて分けた方が良いと判断のもと新しく追加されました。HudiコネクターはOnehouseの方が追加したのですが、DDLは実行できないなど機能としてはかなり制限されており今後の改善が必要な状態です。

以上、2022年にTrinoで追加された機能を紹介しました。時間があれば個別の機能に関する詳細なポストを書きたいと思います。

ここ数年は毎年Trinoに関するイベントを開催していたのですが、今年は自分が出張や組織変更等で忙しかったこともあり開催できませんでした...。来年はできればオフラインもしくはハイブリッドで開催したいと考えています。もし登壇に興味のある方はぜひお知らせください🐰