使用 Golang 将嵌套数据插入 BigQuery

Posted

技术标签:

【中文标题】使用 Golang 将嵌套数据插入 BigQuery【英文标题】:Insert nested data into BigQuery using Golang 【发布时间】:2015-05-22 11:42:28 【问题描述】:

我可以使用 Golang 将平面对象插入 BigQuery - 如何将嵌套数据插入表中?

我的 BigQuery 架构如下所示(来自示例):

[
    "name": "kind",
    "mode": "nullable",
    "type": "string"
  ,
  
    "name": "fullName",
    "type": "string",
    "mode": "required"
  ,
   "name": "visit",
    "type": "record",
    "mode": "repeated",
    "fields": [
    
       "name": "time",
       "type": "timestamp",
       "mode": "nullable"
    ,
    
       "name": "duration",
       "type": "integer",
       "mode": "nullable"
    
   ]
  
]

我第一次尝试插入看起来像这样(示例):

func ExampleInsert(f string,) 

  jsonRow := make(map[string]bigquery.JsonValue)

  bq, _ := bigquery.New(client)
  request := new(bigquery.TableDataInsertAllRequest)

  rows := make([]*bigquery.TableDataInsertAllRequestRows, 1)

  jsonRow["kind"] = bigquery.JsonValue(kind)
  jsonRow["visit_duration"] = bigquery.JsonValue(duration)

  rows[i] = new(bigquery.TableDataInsertAllRequestRows)
  rows[i].Json = jsonRow

  bq.Tabledata.InsertAll(projectID, "visits", "visitsv4", request)
  ...

它可以毫无问题地展平和插入。我只是在使用 visit_duration

但是,我需要遍历一个切片并添加到访问记录中。我尝试构建一个 visit 对象(没有要测试的循环)并将其添加到行中,但它没有插入并且我没有收到任何错误:

func ExampleInsert(f string,) 

  jsonRow := make(map[string]bigquery.JsonValue)

  bq, _ := bigquery.New(client)
  request := new(bigquery.TableDataInsertAllRequest)

  rows := make([]*bigquery.TableDataInsertAllRequestRows, 1)

  jsonRow["kind"] = bigquery.JsonValue(kind)

  visits := make([]*bigquery.TableDataInsertAllRequestRows, 1)

  jsonVisit := make(map[string]bigquery.JsonValue)
  jsonVisit["duration"] = rand.Intn(1000)
  visits[0] = new(bigquery.TableDataInsertAllRequestRows)
  visits[0].Json = jsonVisit

  jsonRow["visit"] = visits

  rows[i] = new(bigquery.TableDataInsertAllRequestRows)
  rows[i].Json = jsonRow

  bq.Tabledata.InsertAll(projectID, "visits", "visitsv4", request)

  _, err := Call.Do()

---[解决方案]----

按照 cmets 中的建议,我也尝试过创建切片,然后附加访问:

var visits []bigquery.JsonValue
visit := make(map[string]bigquery.JsonValue)
visit["duration"] = rand.Intn(100)
visits = append(visits, visit)

jsonRow["visit"] = visits

我可以确认这确实有效 :) 对于那些阅读本文的人来说,即使在添加了切片之后,它最初也没有的原因是因为我复制了表格。在这样做的过程中,我也把结果弄平了。小心。

【问题讨论】:

我不是Golang专家,但visits应该是bigquery.JsonValue的映射 你能举个例子吗? visits := make(map[string]bigquery.JsonValue) 我不确定你为什么使用:TableDataInsertAllRequestRows,它应该只用于有效载荷描述符一次。 而且您还重用了错误的i 值,irows 不同,并且多个visits 必须不同。 【参考方案1】:

访问应该是bigquery.JsonValue 的一部分我不知道你为什么使用:TableDataInsertAllRequestRows 应该只用于负载描述符一次。

var visits []bigquery.JsonValue
visit := make(map[string]bigquery.JsonValue)
visit["duration"] = rand.Intn(100)
visits = append(visits, visit)

jsonRow["visit"] = visits

ps。还要确保你的架构扁平化

【讨论】:

以上是关于使用 Golang 将嵌套数据插入 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

如何使用bigquery流将嵌套数据插入现有记录

(Golang)将数组中的所有行插入到表中

使用 Apache Beam 向 BigQuery 传播插入时如何指定 insertId

如何使用 bigquery 流向现有记录插入嵌套数据

golang中的动态嵌套结构

手撸golang 基本数据结构与算法 插入排序