当前位置: 首页 > 知识库问答 >
问题:

BigQuery:如何将字段添加到重复记录中?

柯良骏
2023-03-14

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

我有一个类似的问题,当目标包含重复字段时,如何从一个BigQuery表复制到另一个?但我不知道如何调整它以适应我当前的用例。

这是我的“新”架构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;

这给了我一个错误:<code>无法访问数组类型的值的字段ceId

有没有人对如何进行有任何建议?谢谢!

共有3个答案

郭兴平
2023-03-14

就在我发布之前,我设法找到了这个问题的答案——但我认为分享这个方法对其他人会很有用。以下是有效的查询:

insert into table2_with_uuid(id, name, created, valid, parameters)
select id, name, created, valid,
[(
GENERATE_UUID(), params.parameter1, params.parameter2, params.parameter3
)]
from table1_no_guid, UNNEST(parameters) params;

希望这是有用的!请随时添加到我的结果或评论中以继续对话。

贺英悟
2023-03-14

每个人都正确。也不正确。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;

在第一个参数上显示错误。参数1,"无法访问数组类型的值上的字段参数1

但是,移除< code >插入到...并修改如下行,查询有效。

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

我可以将结果保存为另一个表,这离得到我需要的答案还有很长的路要走。在我的<code>插入到…</code>行中是否需要修改某些内容以使查询有效?

魏威
2023-03-14

我遵循了官方文档中数据操作语言语法中的过程。

然后,基本上您想要的是更新重复的记录。我遵循了所有示例,从插入到更新,直到在重复记录中添加第二条评论的那一刻。

然后我应用了UNNEST查询:

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并调用tables.patch,这在另一篇堆栈溢出文章中有更详细的讨论,要么从命令行使用带有模式的JSON文件。

我个人遵循了第二种方法(JSON模式文件),并且非常适合我。更详细地说,我遵循的步骤是(如这里所示):

>

  • 在BigQuery UI中使用Copy table获取没有“id”的表的副本。我的起始表在DML之后,副本在DMLmod之后。

    通过在 Cloud Shell 中运行以下命令,将表中的架构复制到 JSON 文件(此处称为 myschema.json)中

    bq show \
    --schema \
    --format=prettyjson \
    testing.followingDMLmod > myschema.json
    
    • 在文本编辑器中打开架构。例如,运行
    vim myschema.json
    
    • 现在修改模式,将新的嵌套列添加到字段数组的末尾。(如果您从未使用过vim,一个非常简单的解释是,“esc”将您返回到正常模式,而在正常模式下,单击“i”允许您写入打开的文件,“:w”保存文件,:q”退出文件)我包括字段“id”:
    {
      "mode": "NULLABLE",
      "name": "id",
      "type": "STRING"
    }
    
      < li >现在您需要通过运行以下命令来更新架构
    bq update testing.followingDMLmod myschema.json
    

    最后,回到BigQuery UI,我使用了查询

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

    以在创建后填充 id 字段。按照此堆栈溢出帖子中的建议进行操作。现在,最终结果确实是预期的!

  •  类似资料:
    • 在log4j1.2中,您只需在运行时获取一个记录器并添加一个appender。例如,这对于测试目的很方便。我们曾经创建一个模拟appender并将其添加到记录器中。随后,我们可以做出不同的断言。 log4j2的等价物是什么? 例如,这个例子展示了其他人是如何添加测试附加器的。 log4j2页面显示了一些关于如何添加附加器的示例。但是,它们将追加器添加到整个上下文中。这似乎不同于为一个特定的记录器添

    • 我计划每天向BigQuery表添加增量数据。每次向现有表添加增量数据时,我都希望从表中现有数据中消除重复记录(基于主键列)。一种方法是:- 从增量数据中收集密钥集(让我们称之为) 在 - 行上运行查询,并将结果存储在新表中。 将增量数据追加到新表中。 我对这种方法的担忧是,它会创建一个大桌子的副本,并添加到我的账单中。 有没有更好的方法可以在不创建重复表的情况下实现相同的目标?

    • 问题内容: 我在任何地方都找不到它,所以您的帮助对我非常有用:)这是该字段: FragmentCategory: 这是发送的表格: 我尝试过这样的事情: categories = fragmentCategory.objects.get(id=1), 要么: 问题答案: Django文档的整个页面都专门针对此内容,并从内容页面进行了索引。 如该页面所述,你需要执行以下操作: 要么

    • 我正在尝试访问record2中的“AccountNumber”字段的数据作为“属性”。文件格式为平面文件(format=“fixedlength”)。请帮帮我。 示例数据:

    • 问题内容: 我有一个json文件: 和一种形式: 我想知道将多个json记录加载到多个表单元素中的正确sintax是什么?您想要修改的表单之类的值会被查询到这些字段中 我知道我可以使用: 但我被困在这里,谢谢 问题答案: 或者,如果您的数据返回是字段名值对,例如: 你可以这样做:

    • 我有下表: 选择*结果JSON schema JSON: 我想通过cust_id和重复的字段来过滤它们的值,所以查询如下: 查询的预期输出: JSON格式查询的预期输出: 受这个问题的启发BigQuery:用标准SQL过滤重复字段我试试这个查询: 哪个输出: 输出JSON: 输出结果是不一样的,我想有,我如何才能实现这一点?