我在大查询中有一个表X,有170,000行。此表上的值基于对表Y中的值进行的复杂计算。这些在python中完成,以便在Y更新时自动进行摄取。
每次Y更新时,我都会在我的脚本中重新计算X所需的值,并使用以下脚本使用流式插入它们:
def stream_data(table, json_data):
data = json.loads(str(json_data))
# Reload the table to get the schema.
table.reload()
rows = [data]
errors = table.insert_data(rows)
if not errors:
print('Loaded 1 row into {}'.format( table))
else:
print('Errors:')
这里的问题是我必须在插入之前删除表中的所有行。我知道一个查询来执行此操作,但它失败了,因为当表中有流式缓冲区时,大查询不允许DML,这显然是一天。
是否有一种解决方法,我可以删除X中的所有行,根据Y重新计算,然后使用上面的代码插入新值? 可能会关闭流式缓冲区?? !!
另一种选择是删除整个表并重新创建它。但我的表格很大,有60列,架构的JSON很大。我无法找到样本,我可以使用从json / file传递的模式创建一个新表?这样的一些样本会很棒。
第三个选项是使流式插入变得智能,它会更新而不是插入行(如果行已更改)。这又是一个DML操作,并回到原始问题。
更新 我尝试的另一种方法是删除表并重新创建它。在删除之前,我复制了模式,以便我可以在新表中进行设置。
def stream_data( json_data):
bigquery_client = bigquery.Client("myproject")
dataset = bigquery_client.dataset("mydataset")
table = dataset.table("test")
data = json.loads(json_data)
schema=table.schema
table.delete()
table = dataset.table("test")
# Set the table schema
table = dataset.table("test",schema)
table.create()
rows = [data]
errors = table.insert_data(rows)
if not errors:
print('Loaded 1 row ')
else:
print('Errors:')
这给了我一个错误: ValueError:设置' view_query'或'架构'。
更新2: 关键是要做一个 table.reload()之前 schema = table.schema来修复上面的内容!