作業実施の背景
ある Firebase プロジェクトに、GA4 プロパティ(プロパティA)が連携済みだとします。
とある事情で一度連携を解除し、別の GA4 プロパティ(プロパティB)を連携しました。
元々プロパティAは、BigQuery へデータをエクスポートしていたため、プロパティBでも BigQuery へのエクスポートを行ったのですが、プロパティIDが変わったため、別のデータセットが出来上がりました。
今後のことも考え、データソースは1つに集約させた方が良いと判断し、BigQuery に存在しているプロパティAのシャーディングテーブルを、プロパティBのシャーディングテーブルに移行することにしました。
この記事は、その際に行った作業内容を記述したものになります。
※あくまで一例であり、この手順が一番最適であるとは限りませんのでご注意ください。
前提
移行したいプロパティAのシャーディングテーブルは、analytics_111111
データセットにあり、2021年1月1日〜2023年2月7日までのシャーディングテーブルが存在しています。
新しく作成したプロパティBのシャーディングは、analytics_222222
データセットに存在にあり、2023年2月7日のシャーディングテーブルまで存在しています。
作業日は、2023年2月8日に行っています。
移行元であるプロパティAのシャーディングテーブルの日付部分を抽出
下記 SQL を実行して、移行したいシャーディングテーブルの期間を抽出します。
SELECT
REPLACE(STRING_AGG(CONCAT('"', partition_name,'"') ORDER BY partition_name ), ","," ")
FROM
(
SELECT
DISTINCT event_date AS partition_name
FROM
`project_id.analytics_111111.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20230206'
ORDER BY PARSE_DATE("%Y%m%d", event_date)
)
プロパティBのシャーディングテーブルにコピー
CLOUD SHELL を開き、コピー用のシェルスクリプトbq_cp.sh
を作成します。
tables
変数には、先程抽出したシャーディングテーブルの期間の文字列を渡してください。
tables=("20210101" "20210102" ... "20230205" "20230206")
for val in ${tables[*]}; do
bq cp -a analytics_111111.events_$val analytics_222222.events_$val
done
$ /bin/sh bq_cp.sh
でシェルスクリプトを実行し、コピーが完了するのを待ちます。
最新のシャーディングテーブルの差分を埋める
切り替えた日のみ、analytics_111111.events_20230207
とanalytics222222.events_20230207
にレコードが分散しているので、analytics222222.events_20230207
に寄せます。
-- 新しいプロパティに対して、切り替えた日の一時テーブルを作成
CREATE TABLE `project_id.analytics_222222.tmp_events_20230207`
AS
SELECT * FROM `project_id.analytics_222222.events_20230207`;
-- 一時テーブルに、古いプロパティの切り替えた日のレコードを挿入
INSERT INTO `project_id.analytics_222222.tmp_events_20230207` (event_date, event_timestamp, event_name, event_params, event_previous_timestamp, event_value_in_usd, event_bundle_sequence_id, event_server_timestamp_offset, user_id, user_pseudo_id, privacy_info, user_properties, user_first_touch_timestamp, user_ltv, device, geo, app_info, traffic_source, stream_id, platform, event_dimensions, ecommerce, items)
SELECT
*
FROM
`project_id.analytics_111111.events_20230207`;
-- 新しいプロパティの切り替えた日のシャーディングテーブルを削除
DROP TABLE `project_id.analytics_222222.events_20230207`;
-- 一時テーブルを切り替えた日のシャーディングテーブルとして作成
CREATE TABLE `project_id.analytics_222222.events_20230207`
AS
SELECT * FROM `project_id.analytics_222222.tmp_events_20230207`;
-- 一時テーブルを削除
DROP TABLE `project_id.analytics_222222.tmp_events_20230207`;
一通り確認し、問題なさそうであれば、プロパティAのanalytics_111111
データセットを削除すれば完了です。