[プレビュー]Pipe構文が利用申請不要でBigQueryとCloud Loggingで使用できるようになりました

[プレビュー]Pipe構文が利用申請不要でBigQueryとCloud Loggingで使用できるようになりました

Clock Icon2025.02.06

概要

2025/2/6からBigQueryのPipe構文(Pipe syntax)が利用申請不要でBigQueryとCloud Loggingで使用できるようになりました。
Pipe syntax is now available for all BigQuery and Cloud Logging users by defaultという件名のメールでアナウンスされています。

2024年10月に利用申請が必要なプレビューとして公開されていましたが、2025/2/6からは利用申請することなくどのプロジェクトでも使用することができます。
実際に利用申請していないプロジェクトで試してみたところ問題なく使用することができました。

プロジェクトでデフォルトで使用できますが、リファレンスではPreview表記がついているのでまだPreview段階のようです。メールでもGAになったとの明確な記載はありませんでした。

Pipe構文のリファレンスは以下となります。
https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax

Pipe構文の概要

BigQueryの Pipe (|>) 構文 は、GoogleSQLの拡張機能であり、通常のSQLよりも シンプルで直感的なSQLの実装が可能です。データ処理の流れを順番に書いていくことができるので可読性が高いです。

特徴

  • |> の後に **演算子(operator)**を記述し、データを処理
  • 標準SQLと同じ操作が可能 フィルタリング、集計、結合など
  • クエリの可読性が向上 ネストが減り、処理の流れが直感的
  • 標準SQLと混在可能 サブクエリなどで併用可能
  • Pipe構文はクエリオプティマイザにより最適化され通常のSQLとパフォーマンスは変わらない

通常のSQLとPipe構文の比較

リファレンスの例をもとにみてみます。
通常のSQL:

SELECT item, COUNT(*) AS num_items, SUM(sales) AS total_sales
FROM Produce
WHERE item != 'bananas' AND category IN ('fruit', 'nut')
GROUP BY item
ORDER BY item DESC;

Pipe 構文:

FROM Produce
|> WHERE item != 'bananas' AND category IN ('fruit', 'nut')
|> AGGREGATE COUNT(*) AS num_items, SUM(sales) AS total_sales GROUP BY item
|> ORDER BY item DESC;
  • Pipe構文の場合FROMWHEREAGGREGATEORDER BY の順に 左から右へ適用されるイメージで処理の流れが直感的になっています
  • 通常のSQLの場合、データ処理の順番と記述の順番が一致していません。SELECTから始まっていますが実際に最初に実行(評価)されるのはFROMからです

Pipe構文の主要な演算子

Pipe構文では、以下の演算子を使用できます。

演算子 概要
SELECT 指定したカラムを選択
EXTEND 新しい計算カラムを追加
SET 既存のカラムの値を更新
DROP 指定したカラムを削除
RENAME カラム名を変更
AS テーブルにエイリアスを付与
WHERE 条件に一致する行をフィルタリング
LIMIT 取得する行数を制限
AGGREGATE 集計処理(GROUP BY を含む)
ORDER BY 並び替え
UNION クエリの結果を結合
INTERSECT 共通する行を取得
EXCEPT 片方のクエリにのみ存在する行を取得
JOIN テーブルを結合
CALL テーブル関数(TVF)を呼び出し
WINDOW ウィンドウ関数を適用
TABLESAMPLE ランダムサンプリング
PIVOT 行を列に変換
UNPIVOT 列を行に変換

https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#pipe_operator_list

試してみる

いくつか試してみました。
Pipe構文は基本的にFROM、SELECTから始めて|>演算子(JOINなど)で書いていきます。

FROM句

テーブル取得はFROM句です。いきなりFROM句から書けます。

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)

※WITH句はSELECTまたはFROM句を繋げれば使用できました。
NGの例

WITH test_data AS (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
|> FROM test_data

Syntax error: A pipe operator cannot follow the WITH clause before the main query; The main query usually starts with SELECT or FROM here at [6:1]
構文エラー: メイン・クエリの前の WITH 節の後にパイプ演算子を続けることはできません。メイン・クエリは通常、[6:1] の SELECT または FROM で始まります。(DeepL翻訳)

OKの例

WITH test_data AS(
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
FROM test_data
|> WHERE id > 1
WITH test_data AS(
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
SELECT * FROM test_data
|> WHERE id > 1

SELECT

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
|> SELECT id

id列が抽出されます。
スクリーンショット 2025-02-06 9.17.27.png

WHERE

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
|> WHERE age >= 30;

ageが30以上のデータを抽出。
スクリーンショット 2025-02-06 9.24.36.png

JOIN

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
) AS employees
|> JOIN (
  SELECT 1 AS id, 'Engineering' AS department UNION ALL
  SELECT 2, 'HR' UNION ALL
  SELECT 3, 'Marketing'
) AS departments
ON employees.id = departments.id
|> SELECT employees.id, employees.name, employees.age, departments.department;

スクリーンショット 2025-02-06 9.26.12.png

EXTEND

EXTENDは既存のカラムに新しいカラムを追加する演算子です。

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
|> EXTEND IF(age >= 30, 'Senior', 'Junior') AS age_category;

例:ageが30以上ならSenior、30以下ならJuniorに分類するSQLです。
列が追加されていることが確認できました。

スクリーンショット 2025-02-06 9.22.14.png

WINDOW

Window関数も使用できます。

FROM (
  SELECT 1 AS id, 'Alice' AS name, 25 AS age UNION ALL
  SELECT 2, 'Bob', 30 UNION ALL
  SELECT 3, 'Charlie', 35
)
|> WINDOW RANK() OVER(ORDER BY age DESC) AS rank_age

スクリーンショット 2025-02-06 9.43.11.png

所感

処理の流れが明確になるので、とても気持ちよくSQLが実装できるなと思いました。いままでのSQLだと処理の流れが一致していなかったのでとっつきづらく感じる面もありましたが、このPipe構文だとここが一致するので可読性も高まるしSQLへのハードルも下がるのではないかなと思いました。

一方で開発プロジェクトで通常のSQLとPipe構文のSQLが混在すると、それはそれでカオスになりそうな気もするので開発時にどのように使うのか検討することも必要だなと思います。

メール原文

※表は除いています

Thanks for showing your interest and supporting pipe syntax since its initial launch in October last year. Seeing the large amount of interests, we are excited to share with you that we have made it publicly available starting TODAY, without a need to allowlist your projects.

What is pipe syntax? 
Pipe syntax, a groundbreaking innovation from Google, is now available in BigQuery and Cloud Logging. It supports the same underlying operators as standard SQL, and allows applying operators in any order, any number of times. It introduces an intuitive, top-down syntax that mirrors how you naturally approach data transformations and writing SQL queries.
Example: Suppose you want to know the average number of taxi trips per year in Chicago by payment_type. With pipe syntax, you no longer need to write subqueries, making the query more readable and concise. 
What pipe syntax can be used for?

Whether you're exploring data, building dashboards, or analyzing logs, pipe syntax empowers you to write clearer, more efficient SQL.
Log data analysis: Bring order to usually messy, semi-structured log data with ease using a familiar piped data flow language 
Ad-hoc analysis and query debugging: Iteratively build and debug your queries with a natural, top-down approach. At every step, you can check the intermediate results before adding new pipe operators.
Data engineering lifecycle: Say goodbye to those deeply nested queries and CTEs; pipe syntax reimagines how to parse, extract and transform data, making it easier to create and maintain data pipelines
Applying LLMs and natural language with SQL: It's easier for LLM to generate pipe syntax, and the generated queries can be much simpler and more human-readable.

参考

https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax
https://research.google/pubs/sql-has-problems-we-can-fix-them-pipe-syntax-in-sql/
https://cloud.google.com/blog/products/data-analytics/simplify-your-sql-with-pipe-syntax-in-bigquery-and-cloud-logging?e=48754805&hl=en

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.