BigQuery:使用 python BQ API 向现有表添加新列

Posted

技术标签:

【中文标题】BigQuery:使用 python BQ API 向现有表添加新列【英文标题】:BigQuery : add new column to existing tables using python BQ API 【发布时间】:2016-03-29 21:33:05 【问题描述】:

相关问题:Bigquery add columns to table schema using BQ command line tools

我想使用 BigQuery Python API 在 BigQuery 中的现有表中添加一个新列(更新现有表的架构)。

但是我的代码似乎不起作用。

这是我的代码:

    flow = flow_from_clientsecrets('secret_key_path', scope='my_scope')
    storage = Storage('CREDENTIAL_PATH')
    credentials = storage.get()
    if credentials is None or credentials.invalid:
        credentials = tools.run_flow(flow, storage, tools.argparser.parse_args([]))
    http = httplib2.Http()
    http = credentials.authorize(http)
    bigquery_service = build('bigquery', 'v2', http=http)
    tbObject = bigquery_service.tables()
    query_body = 'schema': 'name':'new_column_name', 'type':'STRING'
    tbObject.update(projectId='projectId', datasetId='datasetId', tableId='tableId', body=query_body).execute()

它返回Provided schema doesn't match existing table's schema 错误。 谁能给我一个有效的 Python 示例? 非常感谢!

【问题讨论】:

您应该提供整个架构,而不仅仅是新字段 嗨 Mikhail,您是指现有表的整个架构吗? 是的,带有新字段。所以 api 将负责添加新的。但要做到这一点,需要呈现整个架构 嗨,米哈伊尔,我还有一个问题,我知道 BQ 没有 SET 和 UPDATE 方法,只是想知道是否向现有表添加新列,如何设置新列的值现有表?或者我必须删除现有表并使用列值创建一个新表? 啊,我明白了,我会用整个架构再试一次 【参考方案1】:

基于Mikhail Berlyant cmets,我必须将带有新字段(列)的现有表架构传递给update() 方法以更新现有表的架构。

下面给出一个python代码示例:

...
tbObject = bigquery_service.tables()
# get current table schema
table_data = tbObject.get(projectId=projectId, datasetId=datasetId, tableId=tableId).execute()
schema = table_data.get('schema')
new_column = 'name': 'new_column_name', 'type': 'STRING'
# append new field to current table's schema
schema.get('fields').append(new_column)
query_body = 'schema': schema
tbObject.update(projectId='projectId', datasetId='datasetId', tableId='tableId', body=query_body).execute()

此外,无法为现有行(表)设置新列的值。感谢Mikhail Berlyant 的建议,为现有行设置值的方法是为具有值的新列创建一个单独的表,并将现有表与该表连接以替换旧模式表

【讨论】:

【参考方案2】:

我的 cmets 总结(因为我现在有几分钟的时间):

需要将整个架构(连同新字段)提供给 api 将为现有行添加带有空值的新字段。没办法设置 价值 您可以在要运行的查询中包含一些逻辑 这张表来弥补这一点。或者你可以有单独的表 只是这个新领域和一些你将加入你的关键 现有表和新表以获取此字段

【讨论】:

更多关于适用于架构更新的补丁与更新:***.com/a/17113985/1375400

以上是关于BigQuery:使用 python BQ API 向现有表添加新列的主要内容,如果未能解决你的问题,请参考以下文章

用于扩展或增强 bq 命令行的 Google BigQuery bq 命令行 SDK

BQ API ::查询与插入('查询')作业

从表中读取 BigQuery 数值数据类型

将批量数据写入 bigQuery

BigQuery 控制台 api“无法在没有项目 ID 的情况下开始工作”

BigQuery Python 409 已经存在:表格