如何仅从 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
中的架构具有字段 index 和 name,那么您的 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 方法中获取错误?的主要内容,如果未能解决你的问题,请参考以下文章
Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?
BigQuery:如何使用 bigquery.Client().copy_table 方法覆盖表
如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?