python - 在 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
选项时,它工作正常,但随后它将列作为字符串导入。
解决方案
您不能在模式中只指定一列,因为在设置时需要所有列的名称和类型。另一方面,格式中的日期dd.mm.yyyy
不能像DATE
加载到 BigQuery 时那样解析,因此您必须将其加载为STRING
,然后在导入 BigQuery 后对其进行解析。否则,您将不得不将数据格式更改为YYYY-MM-DD
.
推荐阅读
- linux - AWK:如何在不覆盖要打印的第一个参数的情况下按索引和列进行剪切和重新排列
- javascript - 签署 Android 应用程序后 WebRTC 失败
- docker - jenkinsci / docker - 安装的库不会在重建中持续存在
- python - 为什么我在 pandas 访问 MySQL 时得到 Timedelta 类型
- sql - Hive - 跨列/多行的最大值
- python - Numpy 结构化数组无法进行基本的 numpy 操作
- google-apps-script - 从 AdWords 脚本将数据保存到 Google SQL(通过 JDBC)非常慢
- java - ZLIB 解压不工作
- unity3d - 统一保存输入框
- c - 当用户输入字符或字符串时如何使代码显示“无效输入”(验证)