BigQueryのカラム変更はREQUIREDをNULLABLEにする以外は出来ません
テーブル スキーマの手動変更
作り直すしかないんですが、分割テーブルだともう一手間必要ですよという話
例えば以下のように分割テーブルを作るとします
bq mk --dataset test
bq mk --table \
--time_partitioning_type DAY \
test.first
データを投入
echo -e "1\thoge" > /tmp/data.tsv
echo -e "2\thuga" >> /tmp/data.tsv
echo -e "3\tabcd" >> /tmp/data.tsv
bq load --source_format=CSV --field_delimiter="\t" \
'test.first$20200501' /tmp/data.tsv id:NUMERIC,description:STRING
bq load --source_format=CSV --field_delimiter="\t" \
'test.first$20200502' /tmp/data.tsv id:NUMERIC,description:STRING
取り込み時間別に分割されているのが分かります
echo "#standardSQL" > /tmp/query.sql
echo 'select _PARTITIONTIME as pt, count(*) as count from test.first group by _PARTITIONTIME order by pt;' >> /tmp/query.sql
cat /tmp/query.sql | bq query
+---------------------+-------+
| pt | count |
+---------------------+-------+
| 2020-05-01 00:00:00 | 3 |
| 2020-05-02 00:00:00 | 3 |
+---------------------+-------+
この時idカラムをSTRINGに変えたくなった場合、作り直すしかないんですが
こうやって作ると全部同じ取り込み時間になってしまいます
echo "#standardSQL" > /tmp/query.sql
echo 'select CAST(id AS STRING) as id, description from test.first;' >> /tmp/query.sql
cat /tmp/query.sql |
bq query --append_table --schema_update_option=ALLOW_FIELD_ADDITION \
--destination_table 'test.second' \
--time_partitioning_type DAY
echo "#standardSQL" > /tmp/query.sql
echo 'select _PARTITIONTIME as pt, count(*) as count from test.second group by _PARTITIONTIME order by pt;' >> /tmp/query.sql
cat /tmp/query.sql | bq query
すべて同じ現在の時間に取り込まれています
+---------------------+-------+
| pt | count |
+---------------------+-------+
| 2020-05-08 00:00:00 | 6 |
+---------------------+-------+
なので時間別に取り込みしていく必要があります
echo "#standardSQL" > /tmp/query.sql
echo 'select _PARTITIONTIME as pt, count(*) as count from test.third group by _PARTITIONTIME order by pt;' >> /tmp/query.sql
cat /tmp/query.sql | bq query
元と同じになりました
+---------------------+-------+
| pt | count |
+---------------------+-------+
| 2020-05-01 00:00:00 | 3 |
| 2020-05-02 00:00:00 | 3 |
+---------------------+-------+