【アップデート】BigQueryのネイティブな TYPEOF 関数でデータの型を取得できるようになりました

【アップデート】BigQueryのネイティブな TYPEOF 関数でデータの型を取得できるようになりました

Clock Icon2025.03.19

データ事業本部のはんざわです。

3 月 17 日の BigQuery のアップデートで、TYPEOF 関数が正式に GA になりました。

You can now use the TYPEOF function to determine the data type of an expression. This feature is generally available (GA).

参考:March 17, 2025

今回のブログでは、TYPEOF 関数の基本的な使い方と、判定できるデータ型について、実際に試しながらご紹介します。

TYPEOF 関数とは?

https://cloud.google.com/bigquery/docs/reference/standard-sql/utility-functions#typeof

TYPEOF 関数は、入力したデータの型の文字列を返す関数です。

これまで BigQuery でデータの型の判定するためには、SAFE_CAST の結果を利用したり、正規表現でパターン分けしたり、BigQuery コミュニティのユーザー定義関数である typeof 関数を使用したりと一手間加える必要がありました。

つまり、今回のアップデートにより、これまでなかった型判定の関数が正式にサポートされたことで、よりシンプルにデータ型を判定できるようになりました。

触ってみる

ここからは実際に、TYPEOF 関数を触ってみたいと思います。

BigQuery の Google SQL がサポートしているデータ型は以下のドキュメントを参考にしてください。

https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types

BigQuery でサポートされている主要なデータ型に対して、TYPEOF 関数を試してみました。
結果は以下の通りです。

SELECT
  -- 要素が数字の配列
  TYPEOF([10, 20]),
  -- 出力結果
  > ARRAY<INT64>

  -- 要素がJsonデータの配列
  TYPEOF([JSON '{"id": 10, "name": "apple"}']),
  -- 出力結果
  > ARRAY<JSON>

  -- ブール値
  TYPEOF(true),
  -- 出力結果
  > BOOL

  -- バイト値
  TYPEOF(b'Classmethod'),
  -- 出力結果
  > BYTES

  -- 日付
  TYPEOF(DATE '2025-03-18'),
  -- 出力結果
  > DATE

  -- 日付と時刻
  TYPEOF(DATETIME '2025-03-18 18:00:00'),
  -- 出力結果
  > DATETIME

  -- 地理データ
  TYPEOF(ST_GEOGFROMTEXT('POINT(139.767125 35.681236)')),
  -- 出力結果
  > GEOGRAPHY

  -- 時間間隔
  TYPEOF(INTERVAL 10 DAY),
  -- 出力結果
  > INTERVAL

  -- JSONデータ
  TYPEOF(JSON '{"id": 10, "name": "apple"}'),
  -- 出力結果
  > JSON

  -- 整数
  TYPEOF(10),
  -- 出力結果
  > INT64

  -- 固定精度数値
  TYPEOF(NUMERIC '10'),
  -- 出力結果
  > NUMERIC

  -- 高精度な固定精度数値
  TYPEOF(BIGNUMERIC '10'),
  -- 出力結果
  > BIGNUMERIC

  -- 浮動小数点数
  TYPEOF(10.1),
  -- 出力結果
  > FLOAT64

  -- 範囲
  TYPEOF(RANGE(DATE '2025-01-01', DATE '2025-03-18')),
  -- 出力結果
  > RANGE<DATE>

  -- 文字列
  TYPEOF('Classmethod'),
  -- 出力結果
  > STRING

  -- 構造体
  TYPEOF(STRUCT(10 AS id, 'apple' AS name)),
  -- 出力結果
  > STRUCT<id INT64, name STRING>

  -- 配列を含む構造体
  TYPEOF(STRUCT([10] AS ids, ['apple'] AS names)),
  -- 出力結果
  > STRUCT<ids ARRAY<INT64>, names ARRAY<STRING>>

  -- 時刻
  TYPEOF(TIME '18:00:00'),
  -- 出力結果
  > TIME

  -- タイムスタンプ
  TYPEOF(TIMESTAMP '2025-03-18 18:00:00')
  -- 出力結果
  > TIMESTAMP

  -- null
  TYPEOF(null)
  -- 出力結果
  > INT64

結果から分かるように、TYPEOF 関数は BigQuery でサポートされている主要なデータ型に対応していました。特に、配列や構造体のような複合型の場合、内部の要素のデータ型まで取得できることが確認できました。

また、null を渡した場合、INT64 が返ってきます。
これは、BigQuery が型推論を行う際に、特に指定がない場合、デフォルトで INT64 を返すためです。

https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_rules#supertypes

If all input types are related to NULL literals, then the resulting supertype is INT64

次に、テーブルのカラムを渡してみたいと思います。bigquery-public-data.samples.trigrams のサンプルテーブルの ngram カラムと first カラムに対して、TYPEOF 関数を実行してみます。

SELECT
  TYPEOF(ngram),
  TYPEOF(first)
FROM
  bigquery-public-data.samples.trigrams

以下のキャプチャの通り、テーブルのデータを渡した場合でもカラムの型を取得することができました。

スクリーンショット 2025-03-19 21.17.22

最後に、bigquery-public-data.samples.trigrams のサンプルテーブルの cell カラムのように配列の中に構造体が入り、さらにその構造体の中に配列が入っているような複雑な構造体と配列を持ったテーブルのデータを渡してみます。

SELECT
  DISTINCT TYPEOF(cell)
FROM
  bigquery-public-data.samples.trigrams

ネストが深く、複数のデータ型を含む複雑な構造体と配列で構成されたカラムでも TYPEOF 関数は内部の要素の型を取得することができました。

-- 取得結果
ARRAY<STRUCT<value ARRAY<STRING>, volume_count INT64, volume_fraction FLOAT64, page_count INT64, match_count INT64, sample ARRAY<STRUCT<id STRING, text STRING, title STRING, subtitle STRING, authors STRING, url STRING>>>>

-- 見やすくした取得結果
ARRAY<
  STRUCT<
    value ARRAY<STRING>,
    volume_count INT64,
    volume_fraction FLOAT64,
    page_count INT64,
    match_count INT64,
    sample ARRAY<
      STRUCT<
        id STRING,
        text STRING,
        title STRING,
        subtitle STRING,
        authors STRING,
        url STRING
      >
    >
  >
>

まとめ

今回のブログでは、BigQuery に新たに追加された TYPEOF 関数を紹介しました。

これまで、データ型を判定する処理がある場合、SAFE_CAST を使用したり、複雑な条件分岐を記述したユーザー定義関数を用意する必要がありましたが、TYPEOF 関数を利用することで、これらの処理をよりシンプルに記述することができます。これにより、クエリの可読性が向上し、メンテナンスも容易になると思います。

是非、実際に試してみてください!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.