在 Python 脚本中忽略 BigQuery use_avro_logical_types

Posted

技术标签:

【中文标题】在 Python 脚本中忽略 BigQuery use_avro_logical_types【英文标题】:BigQuery use_avro_logical_types ignored in Python script 【发布时间】:2019-01-17 18:27:40 【问题描述】:

我正在尝试使用 Python 脚本将 AVRO 文件加载到 BigQuery。这个过程本身会成功,但我在让 BigQuery 在创建表期间使用 AVRO 的逻辑数据类型时遇到了一些问题。

Google here 记录了使用这些逻辑类型,并已添加到 google-cloud-python 库 here。

我不是专业的编码员,但我希望低于 sn-p 是正确的...但是,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
        
    ]

谁能详细说明这个问题?谢谢!

【问题讨论】:

能否包含数据的 avro 架构?我想确认时间戳列的逻辑类型注释。 @shollyman 添加了! 【参考方案1】:

显然我的 Python 库没有我想象的那么最新。更新我的 Google Cloud 库解决了这个问题。感谢您的意见shollyman

【讨论】:

完美,也为我解决了。不要忘记接受你的答案:)【参考方案2】:

代码看起来正确,逻辑类型注释看起来也正确。我看到您同时具有毫微精度和微精度,但我认为这在这种情况下并不重要。

一种可能性:您正在写入现有表吗?如所写,代码示例将使用APPEND 写入配置作为加载作业的默认配置。在这种情况下,负载可能正在使架构适应定义的内容(例如,表最初是使用作为 INTEGER 而不是 TIMESTAMP 的列创建的)。您应该能够通过将负载定向到不存在的表来进行测试,或者可能使用截断写入处置来允许覆盖表。

var_job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE

【讨论】:

我从 GUI 中手动删除了表。我也尝试了您的解决方案,但不幸的是没有改变。使用 CLI 和属性上传相同的文件可以正常工作.. 这很不寻常。我adapted your sample 并且能够成功使用它。您能否在 public issue tracker 上提交问题,并附上项目和演示此问题的示例作业 ID?

以上是关于在 Python 脚本中忽略 BigQuery use_avro_logical_types的主要内容,如果未能解决你的问题,请参考以下文章

Python BigQuery 脚本 bigquery.jobs.create 错误

Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中

BigQuery - use_avro_logical_types 在 python 脚本中不起作用

如何使用调用 UDF 的 Python 脚本来使用 BigQuery API

如何在没有授权令牌的情况下从 python 脚本查询 google-bigquery 中的私有表?

我的第一个 BigQuery python 脚本