[プレビュー]Pipe構文が利用申請不要でBigQueryとCloud Loggingで使用できるようになりました
概要
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構文のリファレンスは以下となります。
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構文の場合
FROM
→WHERE
→AGGREGATE
→ORDER 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 |
列を行に変換 |
試してみる
いくつか試してみました。
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
列が抽出されます。
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以上のデータを抽出。
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;
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です。
列が追加されていることが確認できました。
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
所感
処理の流れが明確になるので、とても気持ちよく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.
参考