我在Go中创建一个RESTful API,用于在BigQuery中写入行。我正在使用Google BigQuery package for Go。
为了创建BigQuery方案,我在example中描述的结构中推断模式。
问题在于,生成的模式将所有非重复字段都包含为"必需",这样,当我想上传具有空值的结构时,空值将作为empy字段上载...
这是我的结构的一个例子:
type Stats struct {
Name string `bigquery:"name"`
LastName int `bigquery:"last_name"`
PhoneNumber string `bigquery:"phone_number"`
}
这是如何创建架构的示例:
testSchema, err := bigquery.InferSchema(Stats{})
if err != nil {
// TODO: Handle error.
}
而且,如果我上传的结构只有一个字段集:
rows := []*Stats{
{Name: "testA"},
}
u := table.Uploader()
err2 := u.Put(ctx, rows)
结果是,在BigQuery中,字段" last_name"和" phone_number"是一个空字符串""而不是NULL
答案 0 :(得分:1)
为此,显然你必须使用特定的BigQuery可空类型(NullInt64,NullFloat64,NullString,NullBool,NullTimestamp,NullDate,NullTime和NullDateTime)。
使用bigquery.NullBool的示例:https://godoc.org/cloud.google.com/go/bigquery#ex-InferSchema--Tags
答案 1 :(得分:0)
我不是专家,但在https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/bigquery/schema.go#L182查看代码时,inferFieldSchema
方法似乎总是设置Required: true
。我会提交一个允许控制它的错误(虽然不清楚如何),或者你可以在创建模式后修补模式 - BigQuery支持从REQUIRED到NULLABLE的模式修改。