Trino (Presto) とは

  • Presto:Hive クエリ処理の遅さを解決するために Facebook で開発された OSS
  • Trino:Presto から名称変更

Hive と Trino の違い

アーキテクチャ

Quely Language

Trino SQL(基本)

SELECT

SELECT
  col1,
  col2 AS alias,
  col3 + col4 AS sum_col
FROM schema.table
WHERE col1 = 'A'
ORDER BY col2 DESC
LIMIT 100;

ポイント:

  • AS は省略可
  • LIMIT は 必ず最後
  • ORDER BY + LIMIT は 重い(分散処理のため)

WHERE(フィルタリング)

比較・論理演算子

WHERE col1 = 10
  AND col2 <> 'x' -- x に一致しない
  OR col3 >= DATE '2024-01-01'

IN / NOT IN

WHERE country IN ('JP', 'US', 'KR')
  • NOT IN は NULL を含むと結果が空になることがあるため注意

BETWEEN

WHERE price BETWEEN 100 AND 500

NULL 操作

IS NULL / IS NOT NULL

WHERE col IS NULL

COALESCE(NULL なら別の値を入れる)

SELECT COALESCE(col, 0) FROM table:

IF

SELECT IF(score >= 60, 'pass', 'fail') FROM table;

Trino SQL(応用)

予約語と同じ名前のフィールドにアクセス

例えば ORDER BY 句で使う order という名前のフィールドが data に含まれる場合:

SELECT
  data."order"
FROM
  db.my_table

値の操作

別の型にキャスト

SELECT
  *
FROM
  db.my_table
ORDER BY
  CAST(sales_priority AS INTEGER)

この書き方だと、整数型にキャストしたいフィールドに null や数字以外の文字列が含まれている場合、エラーになる。

エラーを避け、このような場合に null を返すには TRY_CAST を使う:

TRY_CAST(sales_priority AS INTEGER)

配列操作

配列の長さ

SELECT
  cardinality(my_array)
FROM
  db.my_table

配列を flatten

SELECT
  r.record_id
FROM
  db.my_table
  CROSS JOIN UNNEST(records) AS r

複数の配列型フィールド records, records2 があり、

  • records と records2 の長さが同じ
  • records と records2 の要素のフィールド名が重複しない という条件を満たす時、複数の配列をまとめて flatten できる。
SELECT
  r.record_id,
  r.record2_id
FROM
  db.my_table
  CROSS JOIN UNNEST(records, records2) AS r

集約関数

GROUP BY 句でまとめたレコードに対する集約関数。

COUNT

指定したフィールドの件数を集計。DISTINCTをつけることで重複を排除して集計。

SELECT
  category,
  COUNT(record_id),
  COUNT(DISTINCT record_id)  -- 値の重複を排除して集計する場合
FROM
  db.my_table
GROUP BY
  category

ARRAY_AGG

指定したフィールドを配列として取得。

  • ORDER BY 句でソート済み配列にできる
  • DISTINCT で重複を除いて配列にできる
SELECT
  category,
  COUNT(record_id),
  COUNT(record_id ORDER BY record_id),  -- ソート済み配列として取得
  COUNT(DISTINCT record_id ORDER BY record_id)  -- ソート済み重複なし配列として取得
FROM
  db.my_table
GROUP BY
  category