python - BigQuery 是否应该使用 table.insert_data() 且skip_invalid_rows=True 抛出错误?

标签 python google-bigquery google-cloud-platform google-cloud-python

我使用 BigQuery API for Python 通过 table.insert_data()在表中插入数据

有时,一行将包含 None ,该字段设置为 REPEATED 模式表架构。发生这种情况时,API 返回以下错误:

[{'index': 48, 
'errors': [
    {u'debugInfo': u'generic::invalid_argument: Field value cannot be empty.', 
     u'reason': u'invalid', 
     u'message': u'Field value cannot be empty.', 
     u'location': u'name_of_my_field'}]}]

我希望忽略这些行。这是我正在使用的函数的原型(prototype),也可以找到here :

insert_data(rows, row_ids=None, skip_invalid_rows=None, ignore_unknown_values=None, template_suffix=None, client=None)

并且这是我感兴趣的参数,因为它似乎完全符合我的需求:

skip_invalid_rows (bool) – (Optional) skip rows w/ invalid data?

它在 the main API 中镜像此参数:

skipInvalidRows boolean [Optional] Insert all valid rows of a request, even if invalid rows exist. The default value is false, which causes the entire request to fail if any invalid rows exist.

但是通过使用带有skip_invalid_rows=True的函数,会引发相同的错误

这个参数的含义是我想象的那样吗?

值得指出的是:

  • 为什么文档中 skip_invalid_rows 的描述末尾有一个问号?
  • ignore_unknown_values=True 可以很好地实现其自身目的。

非常感谢任何帮助。 :)

最佳答案

也许这很令人困惑,但仍然应该抛出错误,作为告诉最终用户某些内容未按预期处理的方式。

这并不意味着正确的行没有被保存,但它们应该被保存!如果您检查表,您应该会看到这些行正常写入其中。

您可以运行一个简单的测试,例如:

table.insert_data([('1', ['1', None, '2']), ('2', ['1', '2'])])

在这种情况下,值('2', ['1', '2'])应该正常保存。

我同意这个方法的docstrings注释并没有那么有用。我本人正准备提出一个拉取请求,为 Table 资源添加一些新功能,但预计在不久的将来会对这个模块进行一些重大重构,所以现在您可能会在那里找到这些类型的东西(并且其他一些也可能令人困惑的事情,例如 table 中定义的 job 资源)。

关于python - BigQuery 是否应该使用 table.insert_data() 且skip_invalid_rows=True 抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46222247/

相关文章:

python - matplotlib 错误 - 没有名为 tkinter 的模块

google-bigquery - BigQuery 表设计 - 混合事实表和维度表?

google-api - Google Cloud Resource Manager API - 向用户授予所有者角色

google-app-engine - 从同一个项目部署多个应用程序

email - 发送包含许多大附件的电子邮件时,Gmail API 推送通知过多

python - 调试器不会在 VS Code for Python 中的断点处停止

Python Tkinter Canvas 无法绑定(bind)键盘

python - 在 SQLAlchemy 中,如何查询复合主键?

google-bigquery - bq load 命令将 parquet 文件从 GCS 加载到 BigQuery,列名以数字开头

google-bigquery - 从 UI 运行加载作业时,Big-query 现在会自动将长十进制值转换为数字