如何使用 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")
我可以用
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")