插入具有重复的记录列的表中(有问题的屏幕)

时间:2019-07-05 15:02:54

标签: python google-bigquery python-bigquery

我在具有结构的bigquery中有表

enter image description here

以及将数据浪费到测试记录中的问题

我尝试以这种方式插入:

query = (
   """
   INSERT INTO test.qwe (name, nick, test)  
   VALUES(@name, @nick, @test)
   """
)
hitTimeStamp = int(time.time())
query_params = [
   bigquery.ScalarQueryParameter("name", "STRING", hitTimeStamp),
   bigquery.ArrayQueryParameter("nick", "STRING", ["k","TEST"]),
   bigquery.StructQueryParameter(
      "test",
       bigquery.ArrayQueryParameter("a", "STRING", ["adsfwerf","d"]),
       bigquery.ArrayQueryParameter("b", "STRING", ["asda","sdfds"]),
   ),
]
job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params
query_job = client.query(
   query,
   location="US",
   job_config=job_config,
)

我希望数据将被插入!请...

1 个答案:

答案 0 :(得分:0)

现在我看到几个问题:

  1. 您将nick视为一个数组,但将其定义为STRING
  2. 您将test视为包含数组的结构,但是NESTED REPEATED实际上是包含 struct array

不幸的是,看来您从google-cloud-python库中使用的帮助程序没有正确支持创建NESTED REPEATED(结构数组)字段所需的输出。当前有一个issue noting this处于“ To Do”状态(尽管被标记为已关闭,但没有解决方案)。

这可以通过其他库以及BigQuery DML语法中的本机实现,如下所示:

INSERT INTO test.qwe (name,nick,test)
VALUES(
  "name value",
  "nick value",
  [
    STRUCT("adsfwerf" AS a,"asda" AS b),
    STRUCT("d" AS a,"sdfds" AS b)
  ]
)

(请注意,使用ARRAYSTRUCT类型有几种不同的语法,但这是最简洁的,这就是我在这里选择它的原因。)

作为一种解决方法,您总是可以在google-cloud-python提供的帮助程序之外构建查询,然后运行它。您可能还希望打破该问题的线程,并查看项目维护人员是否可以提供任何其他解决方法或帮助添加该功能-或者您可能需要寻找另一个完全支持NESTED REPEATED字段周围功能的库。 / p>