【アップデート】BigQueryのネイティブな TYPEOF 関数でデータの型を取得できるようになりました
データ事業本部のはんざわです。
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).
今回のブログでは、TYPEOF
関数の基本的な使い方と、判定できるデータ型について、実際に試しながらご紹介します。
TYPEOF 関数とは?
TYPEOF
関数は、入力したデータの型の文字列を返す関数です。
これまで BigQuery でデータの型の判定するためには、SAFE_CAST
の結果を利用したり、正規表現でパターン分けしたり、BigQuery コミュニティのユーザー定義関数である typeof
関数を使用したりと一手間加える必要がありました。
つまり、今回のアップデートにより、これまでなかった型判定の関数が正式にサポートされたことで、よりシンプルにデータ型を判定できるようになりました。
触ってみる
ここからは実際に、TYPEOF
関数を触ってみたいと思います。
BigQuery の Google SQL がサポートしているデータ型は以下のドキュメントを参考にしてください。
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
を返すためです。
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
以下のキャプチャの通り、テーブルのデータを渡した場合でもカラムの型を取得することができました。
最後に、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
関数を利用することで、これらの処理をよりシンプルに記述することができます。これにより、クエリの可読性が向上し、メンテナンスも容易になると思います。
是非、実際に試してみてください!