У меня есть задание передачи данных Bigquery в целевую таблицу, которая разбита по месяцам. Таблица была создана с помощью следующей команды:
bq mk --table \
--schema schema.json \
--time_partitioning_field createdAt \
--time_partitioning_type MONTH \
myproject:mydataset.MyTable
Задание передачи данных было создано с помощью клиента Python BQDTS, например:
parent = f"projects/myproject/locations/{location}"
baseparams = {
"file_format": "CSV",
"ignore_unknown_values": True,
"field_delimiter": ",",
"skip_leading_rows": "0",
"allow_jagged_rows": True,
}
params = Struct()
params_content = baseparams.copy()
params_content[
"data_path_template"
] = f"gs://mybucket/**/*.csv"
params_content["destination_table_name_template"] = "MyTable"
params.update(params_content)
tc_dict = {
"display_name": target_display_name,
"destination_dataset_id": "mydataset",
"data_source_id": "google_cloud_storage",
"schedule": "every 24 hours",
"params": params,
}
tc = bigquery_datatransfer_v1.types.TransferConfig(**tc_dict)
response = client.create_transfer_config(
request={"parent": parent, "transfer_config": tc}
)
Как видите, в определении задания нет разделения на разделы, оно указано только в таблице базы данных, как и должно быть в соответствии с документация:
Варианты секционирования Облачное хранилище и передачи Amazon S3 могут выполнять запись в секционированные или несекционированные таблицы назначения. В BigQuery есть два типа разделения таблиц:
Секционированные таблицы: таблицы, секционированные по столбцу. Тип столбца должен быть столбцом TIMESTAMP или DATE. Если целевая таблица разделена на столбец, вы определяете столбец разделения при создании целевой таблицы и указываете ее схему.
Это задание успешно выполнялось несколько дней до прошлой недели (последний успешный запуск - 04.11.2020). Этой ночью (10.11.2020) задание не удалось выполнить со следующим сообщением об ошибке:
Несовместимая спецификация разделения таблицы. Целевая таблица существует с интервалом спецификации разделения (тип: МЕСЯЦ, поле: createdAt), но спецификацией разделения цели передачи является интервал (тип: ДЕНЬ, поле: createdAt). Повторите попытку после обновления целевой таблицы или спецификации разделения переноса.
Я пытался воссоздать таблицы и задания с такой спецификацией, и это действительно терпит неудачу каждый раз, когда тип разделения целевой таблицы равен MONTH. Однако это все еще работает, если тип разделения - ДЕНЬ. Что меня больше всего смущает, так это сообщение о спецификации разделения передачи, поскольку такого параметра, похоже, не существует в документации.
Это недавнее критическое изменение API в GCP, которое еще не было задокументировано?