首页 > 解决方案 > 在 BigQuery 中仅为一列设置架构

问题描述

我有一个 .csv 文件,我想将它附加到我的 BigQuery 数据集/表中,其中一列的格式为 dd.mm.yyyy。因为我想使用分区表,所以我需要一列的格式为 DATE。

但是,我不确定如何为一列设置架构。我尝试了以下方法:

from google.cloud import bigquery as bq

dataset_ref                     = client.dataset(dataset_id)
table_ref                       = dataset_ref.table(table_id)

job_config                      = bq.LoadJobConfig()
job_config.write_disposition    = bq.WriteDisposition.WRITE_APPEND

job_config.source_format        = bq.SourceFormat.CSV
job_config.field_delimiter      = delimiter
job_config.skip_leading_rows    = 1
job_config.autodetect           = True

job_config.schema_update_options = [
    bq.SchemaUpdateOption.ALLOW_FIELD_ADDITION,
]
job_config.schema = [
    bq.SchemaField('date_col', 'DATE')
]

job = client.load_table_from_file(
    source_file,
    table_ref,
    location="europe-west2",  # Must match the destination dataset location.
    job_config=job_config)  # API request

job.result() # Waits for table load to complete.

但它给出了错误:

google.api_core.exceptions.BadRequest: 400 Error while reading data, error message: CSV table遇到太多错误,放弃。行数:1;错误: 1. 请查看 errors[] 集合以获取更多详细信息。

当我取出该.schema选项时,它工作正常,但随后它将列作为字符串导入。

标签: pythonpython-3.xgoogle-cloud-platformgoogle-bigquery

解决方案


您不能在模式中只指定一列,因为在设置时需要所有列的名称和类型。另一方面,格式中的日期dd.mm.yyyy不能像DATE加载到 BigQuery 时那样解析,因此您必须将其加载为STRING,然后在导入 BigQuery 后对其进行解析。否则,您将不得不将数据格式更改为YYYY-MM-DD.


推荐阅读