使用Python配置BigQuery中BIGNUMERIC类型精度与标度时出错
问题解决:创建BigQuery BIGNUMERIC表时出现TypeError
问题原因
你遇到的错误是因为当前使用的google-cloud-bigquery客户端库版本过低,旧版本的SchemaField构造函数不支持直接传入precision和scale参数——这两个参数是较新版本的库才新增的特性。而DataProc集群默认安装的客户端库版本通常会和你使用的spark-bigquery-with-dependencies_2.12-0.24.2.jar保持兼容,版本偏旧。
解决方案
方案1:升级客户端库版本
在DataProc集群的节点上执行以下命令,升级google-cloud-bigquery到支持参数的版本(建议升级到2.0.0及以上):
pip install --upgrade google-cloud-bigquery
升级后,你原来的代码就可以正常运行了。
方案2:适配旧版本库的写法
如果无法升级库版本,改用NumericType类来定义带精度和刻度的BIGNUMERIC字段,代码修改如下:
from google.cloud import bigquery client = bigquery.Client() table_id = "some_project.some_dataset.some_table_name" schema = [ bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"), bigquery.SchemaField( "salary", field_type=bigquery.NumericType(precision=38, scale=2), mode="NULLABLE" ), ] table = bigquery.Table(table_id, schema=schema) table = client.create_table(table)
方案3:用DDL语句创建表
另一种更通用的方式是直接执行BigQuery标准SQL的DDL语句来创建表,不受客户端库版本限制:
from google.cloud import bigquery client = bigquery.Client() table_id = "some_project.some_dataset.some_table_name" ddl_query = f""" CREATE TABLE `{table_id}` ( full_name STRING NOT NULL, salary BIGNUMERIC(38, 2) ) """ client.query(ddl_query).result()
内容的提问来源于stack exchange,提问作者Ethan Alberto
相关产品推荐
相关产品推荐

