2015-05-22 21 views
4

我可以使用Golang将平面对象插入BigQuery中 - 我如何将嵌套数据插入到表中?使用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

但是,我需要循环切片并添加到访问记录。我试图建立一个访问对象(无循环测试),并添加到该行,但它不是插入和我没有得到任何错误:

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() 
} 

--- [解决方法] --- -

正如意见建议,我也尝试创建一个切片,然后追加,请访问:

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

jsonRow["visit"] = visits 

我可以证实这是实际可行的:)对于那些你读这篇文章,其原因它最初并不是,即使在添加一片后,也是因为我有c对着桌子。在这样做的时候,我也弄平了结果。小心。

+0

我不是一个Golang的专家,但'访问'应该是'bigquery.JsonValue'的地图 – Pentium10

+0

你可以举个例子吗? – simonmorley

+0

'visited:= make(map [string] bigquery.JsonValue)' – Pentium10

回答

2

访问应该是一片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。还请确保你有你的模式扁平化

+0

谢谢 - 刚刚学到了很多东西。周末愉快! – simonmorley