如何仅从 Bigquery Client 中的 insert_rows_from_dataframe 方法中获取错误?

Posted

技术标签:

【中文标题】如何仅从 Bigquery Client 中的 insert_rows_from_dataframe 方法中获取错误?【英文标题】:How to only get only errors from insert_rows_from_dataframe method in Bigquery Client? 【发布时间】:2020-03-05 23:43:19 【问题描述】:

我正在使用client.insert_rows_from_dataframe 方法将数据插入到我的表中。

obj = client.insert_rows_from_dataframe(table=TableRef, dataframe=df)

如果没有错误,obj 将是一个空列表,如

> print(obj)
[[] [] []]

但我想知道如果插入时出现错误,如何取出错误消息?

我试过了

obj[["errors"]] ? 

但这是不正确的。请帮忙。

【问题讨论】:

【参考方案1】:

要获得您想要的结果,您必须为您的DataFrame 设置一个与您的架构中的标题相同的标题。例如,如果您在 BigQuery 中的架构具有字段 indexname,那么您的 DataFrame 应该具有这两列。

让我们看看下面的例子:

    我在BigQuery 中创建了一个名为 insert_from_dataframe 的表,其中包含字段索引、名称和编号,分别为 INTEGER、STRING 和 INTEGER,它们都是必需的。 在下图中,您可以看到插入没有错误。在第二张图中,我们可以看到数据已插入。

没有出现错误

数据插入成功

    之后,我删除了相同数据最后一行的列号。如下所示,当我尝试将其推送到 BigQuery 时,出现错误。

鉴于此,我想强调两点:

    返回的错误结构是一个列表列表([]、[]、[]、...])。这样做的原因是因为您的数据应该被推送到 chunks(数据的子集)中。在使用的函数中,您可以使用参数chunk_size=<number_of_rows> 指定每个块将有多少行。假设您的数据有 1600 行,并且您的块大小为 500。您的数据将分为 4 个块。因此,在插入请求之后返回的对象将由一个列表中的 4 个列表组成,其中四个列表中的每一个都与一个块相关。同样重要的是,如果一行失败,同一块内的所有行都不会插入到表中。 如果您使用的是字符串字段,您应该注意插入的数据。有时Pandas 将空值读取为空字符串,这会导致插入机制对数据的误解。换句话说,您的表中可能插入了空字符串,而预期的结果可能是一个错误,指出该字段不能是 null

最后,我想在这里发布一些有用的链接来解决这个问题:

    BigQuery client documentation Working with missing values in Pandas

希望对你有帮助。

【讨论】:

非常感谢您的详细解释,所以我需要遍历列表并找到索引和错误[消息]。这非常有帮助! 您对这个主题还有其他疑问吗?如果答案对您有所帮助,请考虑投票:) 不,这对我帮助很大:) 赞成,很抱歉堆栈溢出,所以刚刚解决。

以上是关于如何仅从 Bigquery Client 中的 insert_rows_from_dataframe 方法中获取错误?的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery:仅从最新表中选择

Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?

BigQuery:如何使用 bigquery.Client().copy_table 方法覆盖表

如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?

如何将存储在 GG Bigquery 中的数据导出到 GZ 文件中。

是否可以仅从一列合并 SQL 中的行?