BigQueryのビューにパラメータを渡せない欠点をテーブル関数で補おう

背景

  • (BigQueryに限らず)ビューは便利
    • テーブル化する必要がないので、ビュー内で参照しているテーブルが更新されたらビューの結果も新しいものを参照できる
    • 物理テーブルと違って、保存料金を気にする必要がない
  • 一方で、ビューにはパラメータを渡すことができない
  • ↑は時々困る
    • 例: BigQueryのAudit Logを社内で広く公開したい
      • クエリに個人情報などが入るプロジェクトがあり得るため、生のAudit Logを公開したくない
        • 適切にフィルタリングした上で公開したい
      • ビューとして提供すると、期間が固定になってしまう
        • Audit Logの元テーブルは巨大なので、適切に日付で絞れないとスキャン量も巨大になってしまう
        • とはいえ、期間を一ヶ月など固定にするとユーザーの利便性を損なってしまう
    • 例: Data Studioで使うクエリにパラメータを渡したい

テーブル関数でパラメータを渡す

この欠点は割と最近(?)できたテーブル関数を使うと解決できます。

使うのも簡単で、こんな感じ。

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name

これで事前に決められたフィルタリングと動的に変更したい部分を同居させることができますね。「認可済みテーブル関数」というのもあるようで、承認済みビューに近いユースケースでも使えそうです。