I can use
SchemaField(f"{field_name}", f"{field_type}", mode="NULLABLE", description=...)
while making a new table.
But I want to update the description of the column of the already uploaded table.
Advertisement
Answer
Unfortunately, we don’t have such a mechanism available yet to update a column description of the table through the client library. As a workaround, you can try the following available options to update your table column level description:
Option 1: Using the following ALTER TABLE ALTER COLUMN SET OPTIONS
data definition language (DDL) statement:
ALTER TABLE `projectID.datasetID.tableID` ALTER COLUMN Name SET OPTIONS ( description="Country Name" );
Refer to this doc for more information about the ALTER COLUMN SET OPTIONS
statement.
Option 2: Using the bq command-line tool’s bq update
command:
Step 1: Get the JSON schema by running the following bq show
command:
bq show --format=prettyjson projectID:datasetID.tableID > table.json
Step 2: Then copy the schema from the table.json
to schema.json
file.
Note: Don’t copy the entire data from the ‘table.json’ file, copy only the schema, it will look something like below:
[ { "description": "Country Name", "mode": "NULLABLE", "name": "Name", "type": "STRING" } ]
Step 3: In the ‘schema.json’ file, modify the description name as you like. Then, run the following bq update
command to update a table column description.
bq update projectID:datasetID.tableID schema.json
Refer to this doc for more information about bq update
command.
Option 3: Calling the tables.patch
API method:
Refer to this doc for more information about tables.patch
API method.
As per your requirement, I took the following Python code from this medium article and not from the Google Cloud official docs. So Google Cloud will not provide any support for this code.
Step 1: Add the schema in the ‘schema.py’ file and modify the column description name as per your requirement:
#Add field schema TableObject = { "tableReference": { "projectId": "projectID", "datasetId": "datasetID", "tableId": "tableID", }, "schema": { "fields": [ { "description": "Country Name", "mode": "NULLABLE", "name": "Name", "type": "STRING" } ], }, }
Step 2: Run the following code to get the expected result:
Note: keep that schema.py and following code file in the same directory.
#!/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")