我使用 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/