如何在BigQuery中使用非必填字段创建表?

时间:2017-01-26 14:36:56

标签: go google-bigquery

我在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

2 个答案:

答案 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的模式修改。