Google bigquery BigQuery:如何向重复记录添加字段?

Google bigquery BigQuery:如何向重复记录添加字段?,google-bigquery,Google Bigquery,我在Google BigQuery中有一个表,它由几个字段组成,然后是一个重复记录,其中可能包含一个或多个对象。我想在重复数据中创建一个带有额外字段的新表,并将原始数据复制到新表中,用GENERATE_UUID的输出填充新字段,以便每个重复数据行都有一个唯一标识符 当时我有一个类似的问题,但我不知道如何调整它以适合我当前的用例 这是我的新模式1,即来自上面链接的模式2 [ {"name": "id", "type": "NUMERIC", "mode": "REQUIRED"},

我在Google BigQuery中有一个表,它由几个字段组成,然后是一个重复记录,其中可能包含一个或多个对象。我想在重复数据中创建一个带有额外字段的新表,并将原始数据复制到新表中,用GENERATE_UUID的输出填充新字段,以便每个重复数据行都有一个唯一标识符

当时我有一个类似的问题,但我不知道如何调整它以适合我当前的用例

这是我的新模式1,即来自上面链接的模式2

[
    {"name": "id", "type": "NUMERIC", "mode": "REQUIRED"},
    {"name": "name", "type": "STRING", "mode": "REQUIRED"},
    {"name": "created", "type": "TIMESTAMP", "mode": "REQUIRED"},
    {"name": "valid", "type": "BOOLEAN", "mode": "REQUIRED"},
    {"name": "parameters", "type": "RECORD", "mode": "REPEATED", "fields":
        [
            {"name": "parameter1", "type": "STRING", "mode": "REQUIRED"},
            {"name": "parameter2", "type": "FLOAT", "mode": "REQUIRED"},
            {"name": "parameter3", "type": "BOOLEAN", "mode": "REQUIRED"}
        ]
    }
]
我希望它以这样的方式结束,模式2:

[
    {"name": "id", "type": "NUMERIC", "mode": "REQUIRED"},
    {"name": "name", "type": "STRING", "mode": "REQUIRED"},
    {"name": "created", "type": "TIMESTAMP", "mode": "REQUIRED"},
    {"name": "valid", "type": "BOOLEAN", "mode": "REQUIRED"},
    {"name": "parameters", "type": "RECORD", "mode": "REPEATED", "fields":
        [
            {"name": "uuid", "type": "STRING", "mode": "REQUIRED"},
            {"name": "parameter1", "type": "STRING", "mode": "REQUIRED"},
            {"name": "parameter2", "type": "FLOAT", "mode": "REQUIRED"},
            {"name": "parameter3", "type": "BOOLEAN", "mode": "REQUIRED"}
        ]
    }
]
我已经用这个模式创建了新的表2。我想从表1中复制,我正在尝试以下内容:

insert into table2_with_uuid(id, name, created, valid, parameters)
select id, name, created, valid,
[(
GENERATE_UUID(), parameters.parameter1, parameters.parameter2, parameters.parameter3
)]
from table1_no_guid;
这给了我一个错误的说法:
无法访问类型为ARRAY的值上的字段ceId我在发布之前设法找到了答案,但我认为分享该方法对其他人很有用。以下是有效的查询:

插入表2_,其中包含_uUIID、名称、已创建、有效的参数 选择id、名称、已创建、有效、, [ 生成_UUID,params.parameter1,params.parameter2,params.parameter3 ] 从表1_no_guid,UNNESTparameters参数;
希望这是有用的!请随时添加到我的结果或评论以继续对话。

每个人都是正确的。而且不正确。unnest用每个重复记录一行替换原始数据。正在尝试此查询:

insert into dummydata_withuuid (id, name, created, valid, parameters)
select id, name, created, valid,
[(
GENERATE_UUID(), parameters.parameter1, parameters.parameter2, parameters.parameter3
)]
from dummydata_nouuid;
显示第一个参数的错误。parameter1,无法访问[5:29]处类型为ARRAY>的值的字段parameter1

但是,请删除插入到。。。并按以下行进行修改,则查询有效

-- insert into dummydata_withuuid (id, name, created, valid, parameters)
select id, name, created, valid,
[(
GENERATE_UUID(), parameters
)]
from dummydata_nouuid;

我可以将结果保存为另一个表格,这对于获得我需要的答案来说是一个漫长的过程。在插入到…中时是否需要修改某些内容。。。行以使查询有效?

我已按照官方文档中的程序进行了操作

然后,基本上你想要的是。我遵循了所有的示例,从插入到更新,直到第二条注释添加到重复记录

然后,我应用了最新的查询:

insert into `testing.followingDMLmod`  (product, quantity, supply_constrained, comments)
select product, quantity, supply_constrained,
[(
GENERATE_UUID(), com.created, com.comment
)]
from `testing.followingDML` , UNNEST(comments) com;
这当然有效,但不能提供预期的结果

根据BigQuery,本机支持多种模式更改,例如向记录添加新的嵌套字段或放松嵌套字段的模式。然后,可能路径正在复制表,然后添加额外的字段

这可以按照管理表模式来完成。也就是说,要么使用API和调用,这在其他堆栈溢出文章中有详细讨论,要么使用JSON文件和来自命令行的模式

我个人遵循了JSON模式文件的第二种方法,对我来说效果非常好。更详细地说,我遵循的步骤如下所示:

使用BigQueryUI中的复制表来获取没有id的表的副本。我的起始表在DML之后,副本在DMLMOD之后

通过在Cloud Shell中运行以下命令,将模式从表复制到一个JSON文件myschema.JSON中

在文本编辑器中打开架构。比如跑步 现在修改模式,将新的嵌套列添加到字段数组的末尾。如果您从未使用过vim,一个非常简单的解释是esc会将您返回到正常模式,而在正常模式下,单击i允许您写入打开的文件,:w保存文件,:q退出文件 我包括了字段id: 现在需要通过运行 最后,回到BigQueryUI上,我使用了这个查询

UPDATE `testing.followingDMLmod` 
SET comments = ARRAY(
    SELECT AS STRUCT * REPLACE(GENERATE_UUID() AS id)
    FROM UNNEST(comments)
  )
WHERE true

在创建后填充id字段。遵循堆栈溢出帖子中的建议。现在,最终的结果真是出乎意料

这显然是完全错误的!你真的测试过吗?为什么这个解决方案无效?我现在已经对它进行了测试,尽管它对行进行了重新排序,但id、名称等都与正确的参数对齐,并且在每个行中都生成了UUID。您需要保留订单吗?谢谢您的回复。我将用另一个数据集重新测试以确定,但为了回答您的问题,不,顺序不重要-尽管我假设分区和集群将被保留。请参阅上面发布的第二个答案以继续讨论。谢谢如果我使用这个新查询,我得到的结果与前面的选项完全相同,缺点是现在必须创建一个新表。此外,底层模式不同,不会是Schema2。我仍然不明白为什么前面的查询对您不起作用。UNNEST将原始数据替换为每个重复记录一行,但在选择它们之后,我们将它们重新组合到一个记录类型中,最终得到Schema2。您能否分享一个虚拟示例,其中使用UNNEST的过去语法失败?你的预期结果是什么?谢谢。是的,我同意你关于为每个销售代表创建一行最不现实的说法
eated记录-但我不确定的是,在选择它们之后,我们将它们重新组合成一种记录类型。假设我们有一个商定的平面表-选择什么让我们回到一个重复记录的表?这难道不需要一个中间表吗?嗨,托尼,我一直在调查并找到一种方法来实现你想要的。为了清晰起见,我决定发布一个包含所有步骤的答案。谢谢!我将测试它,并在下面发表评论/问题。感谢您的大量详细和深思熟虑的回复,非常感谢。我遵循您的推理,但我不知道如何处理tables.get和tables.patch API探索者——我以前没有使用过它们,也没有使用过任何API探索者,只有BigQuery web UI。另外,当你说使用JSON文件的命令行时,你能在此基础上展开吗?你是说BigQueryUI右上角的CloudShell链接吗?对不起,这也是新的。JSON文件中还有什么?没问题,我将在我的响应中明确地包括我从Cloud Shell中的命令行执行此操作所遵循的步骤。我已经包括了这些步骤,如果有不清楚的,请告诉我。云Shell确实可以使用UI右上角的链接打开。感谢您提供的扩展答案!非常熟悉vi顺便说一句:D我明天可能会去测试这个,但再次感谢您的帮助和对原始答案的扩展。嗨-再次感谢您提供的详细步骤。如果我理解正确,这就是我们正在做的:1。通过BigQuery UI 2创建原始表no uuid的相同副本。在命令行中,将新表的模式提取到一些json 3中。编辑json以添加第4节重复的新字段。在命令行中使用bq update,使用新的json 5更改表的模式。在UI中运行更新以将uuid移动到新字段中。继续
vim myschema.json
{
  "mode": "NULLABLE",
  "name": "id",
  "type": "STRING"
}
bq update testing.followingDMLmod myschema.json
UPDATE `testing.followingDMLmod` 
SET comments = ARRAY(
    SELECT AS STRUCT * REPLACE(GENERATE_UUID() AS id)
    FROM UNNEST(comments)
  )
WHERE true