大查询插入/删除表

时间:2017-05-09 17:00:34

标签: python sql json google-bigquery google-cloud-platform

我在大查询中有一个表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来修复上面的内容!

0 个答案:

没有答案