如何使用 python 脚本更新 BigQuery table 中的列描述?

How do I update column description in BigQuery table using python script?

我可以用 SchemaField(f"{field_name}", f"{field_type}", mode="NULLABLE", description=...) 同时制作新的 table.

但我想更新已上传的列的描述table。

不幸的是,我们还没有这样的机制来通过客户端库更新 table 的列描述。作为解决方法,您可以尝试以下可用选项来更新您的 table 列级别描述:

选项 1:使用以下 ALTER TABLE ALTER COLUMN SET OPTIONS 数据定义语言 (DDL) 语句:

ALTER TABLE `projectID.datasetID.tableID`
ALTER COLUMN Name
SET OPTIONS (
 description="Country Name"
);

有关 ALTER COLUMN SET OPTIONS 语句的详细信息,请参阅此 doc

选项 2:使用 bq command-line 工具的 bq update 命令:

第 1 步:通过 运行 执行以下 bq show 命令获取 JSON 架构:

bq show --format=prettyjson projectID:datasetID.tableID > table.json

第 2 步:然后将架构从 table.json 复制到 schema.json 文件。

注意:不要从“table.json”文件中复制全部数据,只复制架构,它看起来如下所示:

[
    {
        "description": "Country Name",
        "mode": "NULLABLE",
        "name": "Name",
        "type": "STRING"
    }
]

第三步:在‘schema.json’文件中,根据需要修改描述名称。然后,运行下面的bq update命令更新一个table列描述。

bq update projectID:datasetID.tableID schema.json

有关 bq update 命令的更多信息,请参阅此 doc

选项 3:调用 tables.patch API 方法:

请参阅此 doc 了解有关 tables.patch API 方法的更多信息。

根据您的要求,我从 medium article 而不是 Google Cloud 官方文档中获取了以下 Python 代码。所以Google Cloud 将不会对此代码提供任何支持。

第 1 步:在“schema.py”文件中添加模式并根据您的要求修改列描述名称:

#Add field schema
TableObject = {
   "tableReference": {
     "projectId": "projectID",
     "datasetId": "datasetID",
     "tableId": "tableID",
   },
   "schema": {
     "fields": [
         {
           "description": "Country Name",
           "mode": "NULLABLE",
           "name": "Name",
           "type": "STRING"
         }
       ],
   },
}

第2步:运行以下代码得到预期结果:

注意:将 schema.py 和以下代码文件放在同一目录中。

#!/usr/bin/env python
#https://developers.google.com/api-client-library/python/
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
from schema import TableObject
# [START Table Creator]
def PatchTable(bigquery):
   tables = bigquery.tables()
   tables.patch(                        
         projectId=TableObject['tableReference']['projectId'],\
         datasetId=TableObject['tableReference']['datasetId'],\
         tableId=TableObject['tableReference']['tableId'], \
         body=TableObject).execute()
   print ("Table Patched")
# [END]
def main():
   #To get credentials
   credentials = GoogleCredentials.get_application_default()
   # Construct the service object for interacting with the BigQuery API.
   bigquery = discovery.build('bigquery', 'v2', credentials=credentials)
   PatchTable(bigquery)
 
if __name__ == '__main__':
   main()
   print ("BigQuery Table Patch")