在 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