♻️

BigQueryのコンソールだけでテーブル名を一括変更する

2024/04/22に公開

Suffixの命名にブレがありシャーディングがうまくいっていないテーブルがあった。
具体的には

  • table_yyyymmdd(table_2023010115)
  • table_yyyymmddhh(table_20230102)

が混在していた。

この状況を改善するため、テーブル名を一括で修正するスクリプトを用意した。ただ、Pythonのスクリプトなどを書くのも面倒だったので、BQのコンソールだけで完結するようにクエリを書いた。

クエリ

  • テーブル名の変更には、ALTER TABLE - RENAME TO -を使う。
  • 実行時間は500テーブルで20分ほどだった。
DECLARE table_list ARRAY<STRING>;
DECLARE i INT64 DEFAULT 0;

-- 対象のテーブル名を配列として取得
SET table_list = ARRAY(
    SELECT table_name
    FROM `PROJECT_ID.DATASET_NAME.INFORMATION_SCHEMA.TABLES`
    WHERE table_name LIKE 'table_%15'
);

-- WHILE ループを使用してテーブル名を変更
WHILE i < ARRAY_LENGTH(table_list) DO
    BEGIN
        -- try to execute the rename
        EXECUTE IMMEDIATE FORMAT(
            "ALTER TABLE `PROJECT_ID.DATASET_NAM.%s` RENAME TO `%s`",
            table_list[OFFSET(i)],
            SUBSTR(table_list[OFFSET(i)], 1, LENGTH(table_list[OFFSET(i)]) - 2)
        );
    EXCEPTION WHEN ERROR THEN
        -- 例外処理。ログテーブルに書き込むなりなんなり。
capabilities of BigQuery
    END;
    SET i = i + 1;
END WHILE;

参考記事

Discussion