BigQuery是否应该使用带有skip_invalid_rows = True的table.insert_data()抛出错误?

时间:2017-09-14 14:52:07

标签: 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'}]}]

我希望忽略这些行。这是我正在使用的函数的原型,也可以找到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可以正常使用。

任何帮助非常感谢。 :)

1 个答案:

答案 0 :(得分:2)

可能它令人困惑,但仍然应该抛出错误,以此告诉最终用户某些事情没有按预期处理。

这并不意味着虽然没有保存正确的行,但它们应该是!如果你检查你的表,你应该看到这些行正常写在那里。

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

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

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

我同意docstrings对此方法的评论没有帮助。我自己即将发出拉取请求为Table资源添加一些新功能,但是预计在不久的将来会对该模块进行一些重大的重构,所以现在你可能会发现这些类型的东西(以及其他一些东西)这也可能令人困惑,例如job中定义的table资源。