Можете ли вы SQL заполнить таблицу BigQuery и установить режимы столбцов таблицы в одном вызове API? - PullRequest
0 голосов
/ 10 января 2019

Я использую 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.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

это команда, которую вы должны использовать:

bq --location=[LOCATION] load --source_format=[FORMAT] [PROJECT_ID]:[DATASET].[TABLE] [PATH_TO_DATA_FILE] [PATH_TO_SCHEMA_FILE]

как ответил @Roy, это делается только при загрузке . Можете ли вы вывести журналы этой команды?

0 голосов
/ 11 января 2019

См. Документацию здесь: https://cloud.google.com/bigquery/docs/schemas#specify-schema-manual-python

Вы можете передать объект схемы вместе с заданием загрузки, то есть вы можете установить для полей режим = ТРЕБУЕТСЯ

...