2015-05-22 22 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