错误“已设置非重复字段”。从 Datastore 加载到 BigQuery 时

Posted

技术标签:

【中文标题】错误“已设置非重复字段”。从 Datastore 加载到 BigQuery 时【英文标题】:Error "Non-repeated field already set." when loading from Datastore into BigQuery 【发布时间】:2015-08-11 11:58:12 【问题描述】:

[编辑 20160426:这个错误现在似乎已经解决了!]

[编辑 20160219:再次更新此问题,以反映不同的错误消息。另见我提交的bug report。]

我们有一个数据存储表,其中包含category 类型的字段Category,这是一个自定义类。当我们尝试将此表加载到 BigQuery(从数据存储备份)中时,就会出现问题。结果表应包含(简化):

category.subfield1
,category.subfield2
,category.subfield3.subsubfield1
,category.subfield4
,category.subfield5

相反,BigQuery 对类别字段造成严重破坏:

category_1.record.subfield1
,category_1.record.subfield2
,category_1.record.subfield3.subsubfield1
,category_1.entity.subfield1
,category_1.entity.subfield1
,category_1.entity.subfield3.subsubfield1
,category_1.entity.subfield4
,category_1.entity.subfield5
,category_1.provided

(出于说明的原因,省略了十几个__key__-子字段。)

在 20160219 之前,category 字段的乱码输出更严重,但有一个解决方法:通过选项 projection_fields 显式列出所有字段,包括 category。现在这不再可能,因为它会导致不同的错误消息:Field:category [...] Entity was of unexpected kind "__record__"

原始工作 ID:

项目编号:711939958575 没有投影字段:job_Qw6-ygtZNFJ-Y7W0uLEqdvOrO_8 带有投影字段:job_lzzXo92lud9r5kvW7Z1kuzFLxS4

【问题讨论】:

如果对这个问题投反对票的人在这里添加评论会很有帮助。 请提供失败作业的项目 ID 和作业 ID。 BigQuery 工程师可以使用它来查找有关失败的更多详细信息。干杯! @michael-Sheldon 感谢您指出这一点!我已将其添加到问题中 【参考方案1】:

在将备份从数据存储区加载到 BigQuery 时,我们遇到了同样的问题。我们有一个“订单”实体,其中有一个嵌套实体“客户”。自从我们在嵌套实体“客户”中的一个字段上添加了索引后,我们就会从 BigQuery 中收到“已设置非重复字段”错误。

原因是在嵌套实体中的字段上设置索引(例如字段电子邮件上的索引> in Customer)在名为 customer.email 的 Order 实体上创建了一个索引。将数据加载到 BigQuery 时,这会产生 两个字段,称为 customer.email,一个来自嵌套实体,一个来自索引。

我们的解决方案是删除嵌套实体上的索引,以避免在将数据存储备份加载到 BigQuery 时出现这些冲突。不幸的是,我们确实必须删除数据库中的所有现有记录,这对我们来说不是什么大问题,但是您必须确保正确删除索引。

【讨论】:

感谢分享您的发现!您能否将该信息添加到我提交的错误请求中? (请参阅更新的问题。)我将检查我们是否在其中一些嵌套字段上也有索引。 我认为你的解释是正确的。我们有另一个具有相同问题的实体,并且两个实体都有相同的有问题的子实体。至关重要的是,这个其他实体不使用 ArrayList,所以这不是问题。 (这是我的假设。)

以上是关于错误“已设置非重复字段”。从 Datastore 加载到 BigQuery 时的主要内容,如果未能解决你的问题,请参考以下文章

从 GCP-Datastore 获取 LIST 的数据

如何从项目中完全删除 Cloud Datastore?

从 SharedPreferences 迁移到 Jetpack DataStore “Java”

如何从BigQuery导出到Datastore?

使用命令行工具将数据从 Datastore 加载到 BigQuery 时,是啥决定了包含子字段?

DataStore的基础用法