在没有明确定义的结构的情况下插入 BigQuery

Posted

技术标签:

【中文标题】在没有明确定义的结构的情况下插入 BigQuery【英文标题】:Insert into BigQuery without a well defined struct 【发布时间】:2019-05-02 11:48:43 【问题描述】:

我想将任何类型的 JSON 直接插入 BigQuery,但没有找到任何好的方法?所有方法都假设我有一个定义明确的结构,我插入。似乎可以使用旧的已弃用 api,但不能使用新的“cloud.google.com/go/bigquery”包。

我希望 /api/table_name/insert 能够采用任何类型的 json 并将其插入 BigQuery,因为客户端和服务器都知道端点应该转发它的架构。

谢谢

【问题讨论】:

BigQuery 不是“no-sql”数据库,它需要架构。因此,“我想将任何类型的 JSON 直接插入 BigQuery” 将无法工作,而无需先定义架构。但是,如果你已经有一个模式,你可以有一个匹配的结构。 我定义了一个模式,并且一个方法会根据需要动态创建更多模式,但是我不想每次添加新模式时都用新结构重新编译 go 代码 【参考方案1】:

似乎这已被 ValueSaver 取代,您可以像这样实现:

type genericRecord map[string]bigquery.Value

func (rec genericRecord) Save() (map[string]bigquery.Value, string, error) 
    insertID := uuid.New().String()
    return rec, insertID, nil


var data []*genericRecord
json.Unmarshal(<YOUR JSON BYTE>, &data)

ctx := context.Background()
client, err := bigquery.NewClient(ctx, <YOUR PROJECT ID>)
ins := client.Dataset(<DATASET>).Table(<TABLE>).Inserter()
ins.Put(ctx, data)

【讨论】:

以上是关于在没有明确定义的结构的情况下插入 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

可以在不填充数据的情况下创建 BigQuery 表/架构吗?

BigQuery 流式插入如何计费?

BigQuery - 如何在不使用列名作为值的情况下导入 CSV?

使用 WSO2 在 BigQuery 中插入多条记录

“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入

BigQuery:插入行,但不写