🖥

BigQuery | bq コマンド でパーティション情報を保ったままカラム名を変更する

2023/08/26に公開
  • パーティションの単位ごとに、一時テーブルに対して、元テーブルのデータを流し込む。
  • 全単位のコピーが終わったら、元テーブルを一時テーブルで置き換える。 ( bq mv 的なコマンドがないため、 bq cp bq rm などで代用する )

コマンド例

bq query でクエリを発行して、その結果を一時テーブルに流し込んでいく。

bq query \
  --allow_large_results \
  --use_legacy_sql=false
  --time_partitioning_type=DAY \
  --destination_table=dataset.temporary_table\$20180401 \
    "SELECT * EXCEPT (original_column_name), original_column_name AS replaced_column_name FROM dataset.original_table WHERE _PARTITIONTIME = '2018-04-01"

これを日付分繰り返す。

シェルで無理やり日付分を回した例

雑いので参考にする場合はご注意。

sql=$(cat << EOS
SELECT
 CAST(DATE(_PARTITIONTIME) AS STRING) AS date
FROM
  dataset.original_table
GROUP BY
  DATE
ORDER BY
  DATE ASC
EOS
)

sql=$(echo "$sql" | tr '\n' ' ')

bq query "$sql" | grep -E "[0-9]" | sed "s/|//g" | sed "s/ //g" > ./table_list.tmp
while read date; do
  partition_decorator=$(echo $date | tr -d "-")
  table=dataset.original_table\$"${partition_decorator}"
  echo "$table"
  bq query --allow_large_results --use_legacy_sql=false --replace --time_partitioning_type=DAY \
    --destination_table=dataset.temporary_table\$"$partition_decorator" \
    "SELECT * EXCEPT (original_column_name), original_column_name AS replaced_column_name FROM dataset.original_table WHERE _PARTITIONTIME = '${date}'"
done <table_list.tmp

rm table_list.tmp

環境

  • BigQuery CLI 2.0.30

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2018-04-03

Discussion