Я использую Google App Script для переноса данных через BigQuery, и у меня возникла проблема, потому что SQL, который я использую для выполнения загрузки WRITE_TRUNCATE, вызывает воссоздание таблицы назначения с режимами столбцов NULLABLE, а не их предыдущий режим ТРЕБУЕТСЯ.
Попытка изменить режимы на ОБЯЗАТЕЛЬНЫЕ после загрузки данных с использованием исправления метаданных приводит к ошибке, даже если столбцы не содержат нулевых значений.
Я решил обойти эту проблему, отбросив таблицу и воссоздав ее заново с теми же режимами REQUIRED, а затем загрузив данные, используя WRITE_APPEND вместо WRITE_TRUNCATE. Но это невозможно, потому что пользователь хочет иметь одинаковую таблицу источника и назначения в своем SQL.
Кто-нибудь знает, возможно ли определить запрос BigQuery.Jobs.insert
, который включает информацию / метаданные схемы вывода?
Если это невозможно, единственная альтернатива, которую я вижу, - это использовать мою оригинальную работу с WRITE_APPEND, но добавить временную таблицу в процесс, чтобы разрешить появление таблицы назначения в исходном SQL. Но если этого можно избежать, было бы неплохо.
Дополнительная информация :
Я экспериментировал с различными способами установки информации о схеме, но когда они не возвращали сообщение об ошибке, схема, похоже, игнорировалась.
То есть это JSON, который я передаю в BigQuery.Jobs.insert
jsnConfig =
{
"configuration":
{
"query":
{
"destinationTable":
{
"projectId":"my-project",
"datasetId":"sandbox_dataset",
"tableId":"hello_world"
},
"writeDisposition":"WRITE_TRUNCATE",
"useLegacySql":false,
"query":"SELECT COL_A, COL_B, '1' AS COL_C, COL_TIMESTAMP, COL_REQUIRED FROM `my-project.sandbox_dataset.hello_world_2` ",
"allowLargeResults":true,
"schema":
{
"fields":
[
{
"description":"Desc of Column A",
"type":"STRING",
"mode":"NULLABLE",
"name":"COL_A"
},
{
"description":"Desc of Column B",
"type":"STRING",
"mode":"REQUIRED",
"name":"COL_B"
},
{
"description":"Desc of Column C",
"type":"STRING",
"mode":"REPEATED",
"name":"COL_C"
},
{
"description":"Desc of Column Timestamp",
"type":"INTEGER",
"mode":"NULLABLE",
"name":"COL_TIMESTAMP"
},
{
"description":"Desc of Column Required",
"type":"STRING",
"mode":"REQUIRED",
"name":"COL_REQUIRED"
}
]
}
}
}
}
var job = BigQuery.Jobs.insert(jsnConfig, "my-project");
В результате новая или существующая таблица hello_world усекается и загружается с данными, указанными в запросе (поэтому читается часть пакета json), но описания столбцов и режимы не добавляются, как определено в Схема раздела. Они просто пустые и пустые в таблице.
Подробнее
Когда я тестировал запрос REST выше, используя страницу API Googles для BigQuery.Jobs.Insert , он выделил свойство «схема» в запросе как недопустимое. Я думаю, что кажется, что схема может быть определена, если вы загружаете данные из файла, то есть BigQuery.Jobs.Load
, но, похоже, она не поддерживает эту функцию, если вы вводите данные с использованием источника SQL.