🔍

BigQuery SQLを劇的に進化させる!効率化と柔軟性を高める5つの新機能 🎉

に公開

BigQueryをお使いの皆さん、日々のデータ分析、本当にお疲れ様です!

BigQueryのSQLは、大規模なデータセットを扱う上で強力なツールですが、「もっと効率的に書けたら」「もっと柔軟にデータを扱えたら」と感じたことはありませんか?

そんな皆さんの声に応える、SQL記述の効率と柔軟性を劇的に向上させる5つの新機能がリリースされました!

この記事では、データエンジニアリングや分析の作業をスムーズにする、これらの革新的な機能をご紹介します。


1. 柔軟性が向上!集合演算子の「BY NAME / CORRESPONDING」

これまでのBigQueryでのUNIONやINTERSECTといった集合演算では、カラムは**位置(順番)**に基づいてマッチングされていました。しかし、この方式では、テーブルのカラム順が少し変わるだけで、意図しないデータが結合されたり、エラーになったりするリスクがありました。

新機能: UNION ALL BY NAME や CORRESPONDING 構文を使えば、カラム名に基づいてマッチングが行われます。

メリット

  • カラムの順序に依存しない、柔軟で安全なデータ結合が可能になります。
  • 異なるスキーマを持つテーブル間の結合が、より簡単で間違いなく行えます。


SELECT 'Jane' AS first_name, 'Doe' AS last_name, 'manager' AS role
UNION ALL BY NAME
SELECT 'Smith' AS last_name, 'accountant' AS role, 'John' AS first_name;

-- first_name同士、last_name同士、role同士が名前でマッチングされます。


2. 配列操作が簡潔に!「ARRAY_FIRST / ARRAY_LAST / ARRAY_SLICE

配列(ARRAY)型のデータを扱う際、特定の位置の要素を取り出すために複雑なサブクエリを記述する必要があり、クエリの可読性を下げていました。

新機能: 配列操作のための3つのシンプルな関数が追加されました。

関数名 機能
ARRAY_FIRST 配列の最初の要素を返します。
ARRAY_LAST 配列の最後の要素を返します。
ARRAY_SLICE 指定した開始・終了インデックスに基づいて配列の部分集合(サブセット)を返します。

メリット

  • 配列内の特定要素の抽出が、非常に直感的かつ簡潔に行えるようになります。
  • 複雑なサブクエリやOFFSETを使う必要がなくなります。


SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 3) AS result

/*-----------*
 | result    |
 +-----------+
 | [b, c, d] |
 *-----------*/

--  マイナスを指定すると配列の最後から数えていくつまでのoffsetを取るか指定が可能

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, -3) AS result

/*--------*
 | result |
 +--------+
 | [b, c] |
 *--------*/


3. 可読性抜群!「Chained Functions(関数チェーン)」

複数の関数を連続して適用したいとき、これまでは関数の中にまた関数を入れ子にする、深くネストされた構造になりがちでした。これはクエリを非常に読みにくくしていました。

新機能: パイプライン処理のように、ある関数の出力を次の関数の入力として**チェーン(連結)**できるようになりました。

メリット

  • データ変換のステップを左から右へと追えるようになり、クエリの可読性が大幅に向上します。
  • 深くネストされた表現を避け、フラットで理解しやすいコードになります。

--従来構文
SELECT
  SUBSTR(UPPER(col1), 1, 5)
FROM
  employees;



--チェーン呼び出し構文
SELECT
  (col1).UPPER().SUBSTR(1, 5)
FROM
  employees;

4. クエリ内での変数定義を可能にする「With Expression

クエリ内で一時的な変数を作成し、それを後の処理で再利用したい、というニーズは多いでしょう。

新機能: WITHキーワードを式として使用し、その場で一つ以上の変数を定義できます。

メリット

  • 複雑な計算結果や文字列を一時変数として保持し、後の式で再利用できます。
  • 中間的な値をわかりやすい名前で定義できるため、クエリのメンテナンス性が向上します。


SELECT WITH(
  a AS '123',               
  b AS CONCAT(a, '456'),    -- bは、直前のaを使って '123456' となる
  CONCAT(b, '789')          -- 最後にこの式の結果が返される
) AS result; 
-- 結果: '123456789'


5. デバッグを強力にサポート!「TypeOf function

データ分析やエンジニアリングにおいて、予期せぬエラーの原因となるのがデータ型の不一致です。

新機能: TypeOf関数は、与えられた式のデータ型を返します。

メリット

  • 特に複雑な変換処理や結合の際、データの型を即座に確認でき、デバッグ作業が格段にスピードアップします。
  • 型エラーの早期発見に役立ちます。

SELECT
  TYPEOF(NULL) AS A,
  TYPEOF("hello") AS B,
  TYPEOF(12+1) AS C,
  TYPEOF(4.7) AS D,
  TYPEOF(STRUCT<x INT64, y STRING>(25, "apples")) AS struct_type


/*-------+--------+-------+---------+---------------------------*
 |   A   |   B    |   C   |    D    |        struct_type        |
 *-------+--------+-------+---------+---------------------------+
 | INT64 | STRING | INT64 | FLOAT64 | STRUCT<x INT64, y STRING> |
 +-------+--------+-------+---------+---------------------------*/


まとめ:あなたのBigQueryライフを次のレベルへ!

今回ご紹介した5つの新機能は、BigQueryでのSQL記述を「より安全に」「より簡潔に」「より柔軟に」行うための大きな一歩です。

特に、BY NAMEによる集合演算や、Chained Functions、With Expressionは、日々のクエリ作成の効率可読性を飛躍的に向上させるでしょう。

ぜひ、これらの新機能を活用して、あなたのデータ分析・エンジニアリングの生産性を高めてください! Happy Querying! 🚀

Google Cloud Japan

Discussion