在没有明确定义的结构的情况下插入 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 - 如何在不使用列名作为值的情况下导入 CSV?