Go 库的 BigQuery 行插入失败

Posted

技术标签:

【中文标题】Go 库的 BigQuery 行插入失败【英文标题】:BigQuery row insertions failed with Go library 【发布时间】: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.StructSaverStruct: 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 我遇到了同样的无效错误,你有没有解决它。 【参考方案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】:

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

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

【讨论】:

以上是关于Go 库的 BigQuery 行插入失败的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 流式插入在 GKE 上失败

sql [BigQuery - Facebook产品目录]查询para obtenerelcatálogodeproductos de Kichink。 #facebook #bigqu

BigQuery:无效日期错误

BigQuery 代码因使用 pandas python 客户端库的 MemoryError 而失败

如何在 BigQuery 中获取文件加载插入失败的插入记录

尝试从容器引擎 pod 将数据插入 BigQuery 失败