BiqQueryのviewとは
viewはSQLクエリによって定義される仮想テーブル
クエリを記述することで元となるテーブルから必要なデータだけを取り出した
「テーブルのようなもの=ビュー」
viewを使うメリット
作成したクエリ結果をコンソール上で簡単に保存可能
保存したviewはテーブルと同じように扱えるためクエリ労力が減る
データの定義変更する際、テーブルはデータの置き換えが必要だが、viewの定義はもととなるクエリを書き換えるだけで変更可能
※毎日、毎月定期実行するようものをビューとして保存して使うのが一般的
テーブルでは出来てviewでは出来ない期間指定関数
日付を跨いだ期間指定が出来ない
例えばviewが日付ごとに分かれていたとした場合
test-yy.views_000000.events_20230101
test-yy.views_000000.events_20230102
test-yy.views_000000.events_20230103
これら3日間の合計ユーザー数を知りたい場合は
_TABLE_SUFFIX BETWEEN "20230101" AND "20230103"
を指定して集計すれば問題ないが、
viewでは
_TABLE_SUFFIX BETWEEN "YYYYMMDD" AND "YYYYMMDD"
が使用できない
3日間のユーザー数を集計する方法は2通り
・viewをテーブル化する(テーブル作成権限がある場合に限る)
・UNION ALLで3日間分のデータを繋げる
結論
viewデータでしか権限を貰えていない場合は何故テーブルで貰えないかを確認した方が良い
参照権を与えたくないカラムがある為のみであれば(個人情報を閲覧させたくない等)
検討案1:マスク処理したテーブルを新しく作る
マスク処理したテーブルを別途作りマスク済みのカラムを閲覧。
ロードしたテーブルとは別に個人情報ををマスクした値を適用したテーブルを作る。
この方法だとポリシータグと併用はでき、データ基盤でデータレイクの役割は担える一方で、テーブルの実体が増えるので管理が煩雑に。
検討案2:元テーブルにマスク済みのカラムを新しく追加する
元のデータは残したままテーブルにマスクしたカラムを追加する案です。元データは残し、カラムレベルのアクセス制御を行った状態のまま利用者にマスクしたカラムを閲覧。
どうしてもviewでしか参照権を貰えない
スケジュールクエリ等でviewをテーブル化することが賢明
DECLARE yesterday INT64;
SET yesterday = (SELECT CAST(FORMAT_DATE("%Y%m%d",CURRENT_DATE() -1) as INT64));
EXECUTE IMMEDIATE format("""
CREATE OR REPLACE TABLE
`myproject_name.mydataset_name.copy_from_view_%d` AS (
SELECT
*
FROM
`tenzin_project_name.tenzin_dataset_name.events_%d`
)
""", yesterday,yesterday);