Google bigquery 如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表

Google bigquery 如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表,google-bigquery,Google Bigquery,我正在尝试将数据从一个表复制到另一个表。模式是相同的,只是源表中的字段在需要时可以为null。大查询抱怨字段为空。我99%确定问题在于,在许多条目中没有可重复字段,这在使用我们的正常过程插入表时不会导致任何问题 我从中复制的表以前具有完全相同的模式,但在使用不同的分区方案重新创建表时意外丢失了必需的字段 据我所知,无法将现有表中的字段从nullable更改为required。在我看来,您必须创建一个新表,然后使用select查询来复制数据 我尝试过启用“允许大结果”和取消选中“展平结果”,但我发

我正在尝试将数据从一个表复制到另一个表。模式是相同的,只是源表中的字段在需要时可以为null。大查询抱怨字段为空。我99%确定问题在于,在许多条目中没有可重复字段,这在使用我们的正常过程插入表时不会导致任何问题

我从中复制的表以前具有完全相同的模式,但在使用不同的分区方案重新创建表时意外丢失了必需的字段

据我所知,无法将现有表中的字段从nullable更改为required。在我看来,您必须创建一个新表,然后使用select查询来复制数据

我尝试过启用“允许大结果”和取消选中“展平结果”,但我发现了同样的问题。写入首选项为“附加到表”

(注意:请参见下面的编辑,因为我在这里不正确-这是一个数据问题) 我试图构建一个查询来更好地确认我的理论(不是记录存在而是空的),但我正在努力构建一个查询。我可以在预览中清楚地看到,让一些重复的字段为null是一个真正的用例,因此我假设转换为嵌套的必填字段也为null。在将表转换为新分区之前,我们有一个表的备份,它具有与我尝试复制到的表相同的所需模式。在备份的旧版sql中,如果this.nested.required.field为null,则一个简单的
select count(*)表示有相当多的列符合此条件

用于选择要插入的SQL:

select * from my_table
编辑:
在对表进行分区更改时,也将某些字段设置为空值。似乎select查询以某种方式创建了所有字段都为null的对象,而不仅仅是一个null对象。我使用条件将嵌套对象设置为null或拾取其现有值。仍在调查中,但在这一点上,我认为我尝试做的事情通常是受支持的,基于玩一些玩具表/查询。

当尝试从一个表复制到另一个表时,使用SELECT AS STRUCT,运行如下空检查:

IF(foo.bar is null, null, (SELECT AS STRUCT foo.bar.* REPLACE(...))
IF (bar.req is null, null, bar)
这可以防止空嵌套结构转变为充满空值的结构

要通过select语句修复它,请对如下所需的值使用条件检查:

IF(foo.bar is null, null, (SELECT AS STRUCT foo.bar.* REPLACE(...))
IF (bar.req is null, null, bar)

当然,真正的查询要比这复杂得多。好消息是,修复查询应该看起来与破坏格式的原始查询类似

显然,如果我从转换前备份中选择,而不是从新表中选择,那么我尝试执行的操作是有效的。调查。似乎我可以从旧备份中选择,但不能从新备份中选择。我认为所有的数据都遵循相同的模式,所以从我可以看出,BigQuery是变化无常的。你能给我们一个可重复的体验吗?可能与架构共享一个公共表,或者共享重新创建表的说明。谢谢!因此,经过一些调查之后,我能够确定,当我将数据从一个表移动到另一个表以进行分区更改(以及其他一个数据更改)时,不知何故丢失的可空结构会被具有空值的结构填充。i、 e.
IF(some_val_true,null,og.location)AS location
导致location结构存在,但其中的所有字段均为null。我想在这一点上,我需要弄清楚如何从表中重新选择数据并解决这个问题。弄清楚我如何在必填字段中获得空值-我对空值使用select AS STRUCT,而无需事先检查它是否为空。