BigQuery-更新模式,在Python客户端的任意位置添加NULL列

时间:2019-01-11 15:52:56

标签: python google-bigquery database-schema

背景

我想更新BigQuery中一个表的模式以匹配另一个包含原始列超集的表的模式。我想通过BigQuery Python客户端来实现。

问题

在实践中,我想将包含NULL的某些列添加到已经存在的BigQuery表中的任意位置,而不必是开头或结尾。

我知道如何在此snippet之后在表的 end 处添加新列,但是我想在任意位置添加列。而且,我想通过架构更新来做到这一点,而不必查询整个表。

由于该架构实际上是SchemaField对象的列表,因此我认为用append方法替换insert方法就足够了。但是此代码片段无法满足我的要求:

from google.cloud import bigquery
client = bigquery.Client()
dataset_id = 'my_dataset'
table_id = 'my_table'

table_ref = client.dataset(dataset_id).table(table_id)
table = client.get_table(table_ref)  # API request

original_schema = table.schema

new_schema = original_schema[:]  # creates a copy of the schema
# insert new_col at position 2, instead of appending
new_schema.insert(2, bigquery.SchemaField('new_col', 'STRING')) 

table.schema = new_schema
table = client.update_table(table, ['schema'])  # API request

此代码导致模式被完全更新,就像调用的方法是append一样,即new_col被放置在模式的末尾。

问题

您是否知道是否可以修改BigQuery表的模式,以便将新(NULL)列插入到任意位置?

2 个答案:

答案 0 :(得分:0)

根据答案in this question,我建议您可以复制半个表,添加所需的列,然后添加旧表的join,这实际上比在表中仅添加一个新列要昂贵得多。结束,但仍有可能。

答案 1 :(得分:0)

on this post所述,此类功能在任何SQL Server中都不存在,因为列顺序无关紧要。可以做的是附加新列,然后例如扰乱列顺序,并以随机列顺序重新创建表。您对此有什么业务需求?