【问题标题】:BigQuery row insertions failed with Go libraryGo 库的 BigQuery 行插入失败
【发布时间】:2017-01-29 13:42:21
【问题描述】:

当我尝试在 bigquery 中插入时,我收到此错误“X 行插入失败”,其中 X 是行数。

我在 Golang 中使用这个库“cloud.google.com/go/bigquery”

我在这里附上代码:

    u := table.Uploader()

    var inserts []*bigquery.StructSaver
    for _, insert := range value {
        aux := bigquery.StructSaver{Struct: insert, Schema: schema}
        inserts = append(inserts, &aux)
    }

    err := u.Put(ctx, inserts)
    if err != nil {
        fmt.Printf("%v\n", err)
    }

并非每次尝试都会发生这种情况,我不知道什么会产生这种情况。 有人遇到同样的错误吗?

【问题讨论】:

  • 文档指出“如果一个或多个行上传失败,Put 返回一个 PutMultiError。PutMultiError 包含每个失败行的 RowInsertionError。”因此,要获取更多错误信息,您可以将错误类型转换为 PutMultiError(例如:multiError := err.(PutMultiError)),对其进行迭代,然后对 MultiErrors 进行迭代,并打印每个错误。有关详细信息,请参阅文档:godoc.org/cloud.google.com/go/bigquery#PutMultiError
  • 谢谢@1lann!但是我看到的信息只是说“无效”。有什么想法可以得到更详细的原因吗?
  • @OğuzYıldız 我遇到了同样的无效错误,你有没有解决它。

标签: go google-bigquery


【解决方案1】:

使用bigquery.PutMultiError 我得到以下属性,其中Message 描述了失败原因。

  • Location:专栏
  • Message: 失败了
  • Reason:这可以简单地是invalid

这是一个例子:

{Location: "speed"; Message: "Cannot convert value to integer (bad value):foobar"; Reason: "invalid"}

这是一个使用 PutMultiError 的示例,如 1lann 所述。值得注意的是,Put 可以返回 *errors.errorStringbigquery.PutMultiError,因此检查您有哪些是很有用的。

err := u.Put(ctx, inserts)
if err != nil {
    if multiError, ok := err.(bigquery.PutMultiError); ok {
        for _, err1 := range multiError {
            for _, err2 := range err1.Errors {
                fmt.Println(err2)
            }
        }
    } else {
        fmt.Println(err)
    }
}

【讨论】:

    【解决方案2】:

    一种可能的解决方法是确保导出结构的字段(例如以大写字母开头)。

    这只是一个非常糟糕的错误消息,这只是您收到该错误的原因之一

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多