我可以在制作新表时使用SchemaField(f"{field_name}", f"{field_type}", mode="NULLABLE", description=...)
。
但是我想更新已经上传的表的列的描述。
发布于 2022-04-07 17:10:04
不幸的是,我们还没有这样一种机制可以通过客户端库更新表的列描述。作为解决办法,您可以尝试以下可用选项来更新表列级别的说明:
选项1:使用以下ALTER TABLE ALTER COLUMN SET OPTIONS
数据定义语言语句:
ALTER TABLE `projectID.datasetID.tableID`
ALTER COLUMN Name
SET OPTIONS (
description="Country Name"
);
有关文档语句的更多信息,请参考此ALTER COLUMN SET OPTIONS
语句。
选项2:使用bq命令行工具的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"
}
]
步骤3:在“schema.json”文件中,根据需要修改描述名称。然后,运行以下bq update
命令来更新表列描述。
bq update projectID:datasetID.tableID schema.json
有关文档命令的更多信息,请参考此bq update
。
选项3:调用tables.patch
API方法:
有关文档 API方法的更多信息,请参考此tables.patch
。
根据您的要求,我从这个中篇中获取了下面的Python代码,而不是Google官方文档中的代码。因此Google将不提供对此代码的任何支持。
步骤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")
https://stackoverflow.com/questions/71776036
复制相似问题