BigQuery use_avro_logical_types игнорируется в скрипте Python - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь загрузить файлы AVRO в BigQuery с помощью скрипта Python. Этот процесс сам по себе успешен, но у меня возникают некоторые проблемы с тем, чтобы BigQuery использовал логические типы данных AVRO во время создания таблицы.

Использование этих логических типов задокументировано Google здесь и добавлено в библиотеки google-cloud-python здесь .

Я не программист по профессии, но я ожидаю, что приведенный ниже фрагмент будет правильным ... Однако свойство use_avro_logical_types, похоже, игнорируется, и временные метки загружаются как INT вместо TIMESTAMP.

...    
with open(full_name, 'rb') as source_file:
           var_job_config = google.cloud.bigquery.job.LoadJobConfig()
           var_job_config.source_format = 'AVRO'
           var_job_config.use_avro_logical_types = True
           job = client.load_table_from_file(
               source_file, table_ref, job_config=var_job_config)
        job.result()  # Waits for job to complete
...

Схема AVRO выглядит следующим образом:

{
    "type": "record",
    "name": "table_test",
    "fields": [{
        "name": "id_",
        "type": {
            "type": "bytes",
            "logicalType": "decimal",
            "precision": 29,
            "scale": 0
        }
    },
    {
        "name": "datetime_",
        "type": ["null",
        {
            "type": "long",
            "logicalType": "timestamp-micros"
        }]
    },
    {
        "name": "integer_",
        "type": ["null",
        {
            "type": "bytes",
            "logicalType": "decimal",
            "precision": 29,
            "scale": 0
        }]
    },
    {
        "name": "varchar_",
        "type": ["null",
        {
            "type": "string",
            "logicalType": "varchar",
            "maxLength": 60
        }]
    },
    {
        "name": "capture_time",
        "type": {
            "type": "long",
            "logicalType": "timestamp-millis"
        }
    },
    {
        "name": "op_type",
        "type": "int"
    },
    {
        "name": "seq_no",
        "type": {
            "type": "string",
            "logicalType": "varchar",
            "maxLength": 16
        }
    }]
}

Может кто-нибудь уточнить этот вопрос? Спасибо!

Ответы [ 2 ]

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

Очевидно, что мои библиотеки Python были не такими современными, как я думал ... обновление моих библиотек Google Cloud решило проблему. Спасибо за ваш вклад Шоллиман

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

Код выглядит правильно, и аннотации логического типа также выглядят корректно. Я вижу, что у вас есть как милли, так и микро точность, но я не верю, что это будет иметь значение в этом случае.

Одна возможность: вы пишете в существующую таблицу? Как написано, пример кода будет использовать расположение записи APPEND в качестве значения по умолчанию для заданий загрузки. В этом случае загрузка может адаптировать схему к тому, что определено (например, таблица была изначально создана со столбцами как INTEGER, а не TIMESTAMP). Вы должны быть в состоянии выполнить тестирование, направив загрузку в несуществующую таблицу или, возможно, используя расположение усеченной записи, чтобы перезаписать таблицу.

var_job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
...