BigQuery:从复杂的嵌套 JSON 键值创建列

Posted

技术标签:

【中文标题】BigQuery:从复杂的嵌套 JSON 键值创建列【英文标题】:BigQuery: creating columns from a complex nested JSON Key-Value 【发布时间】:2017-12-13 13:08:22 【问题描述】:

这个问题是this one 的一个更复杂的变体 我正在尝试将事件数据加载到 JSON 具有以下结构的 Bigquery 中:


"simpleKV1String": "Foo",
"simpleKV2String": "Bar",
"simpleKV3String": "qux",
"complexKV": 
    "subKey1WithArrayInt": [1, 2, 3],
    "subkey2": 
        "subkey2Subkey1String": "corge",
        "subkey2Subkey2String": "grault",
        "subkey2Subkey3Int": 666       
        
    

这个想法是 simpleKV 列简单地将 1 对 1 映射到 Bigquery String 列 然而,对于 complexKV 'column',我们有 3 个选项:

    将 complexKV 键的嵌套值作为 JSON blob 保留在 BigQuery 字符串字段中。 完全标准化。 将其映射到复杂的 BiqQuery 数据类型,例如(再次)完成 in the other *** example。

我们的要求:

我们已经知道 complexKV 的嵌套模式将会演变:将来会添加一个本身具有嵌套数据的 subkey3(可能还有 4 个)。 我们希望尽量减少对 BigQuery 表的更改(支持选项 1)。 我们希望嵌套数据的使用尽可能简单(支持选项 2 或 3)。

由于 BigQuery 不支持架构演化 AFAIK,我认为我们只剩下选项 1,不幸的是,这使得使用数据更加复杂......

我是对的还是有更聪明的方法来做到这一点?

【问题讨论】:

您的费率很低。对 SO 很重要,您必须使用已发布答案左侧、投票下方的勾号来标记已接受的答案。这将提高您的费率。通过访问此链接了解其工作原理:meta.***.com/questions/5234/… 【参考方案1】:

如果您的子键出现新的 3 和 4,我将添加为具有各自结构的新列。

我会结合并同时做这两种方法,或者至少两种方法。

1) 我会保留为 JSON blob。这样,至少我将收集到的所有数据集中在每一行上,然后可以用来重新实现到列。 我们使用这种列并编写视图来简化 JSON 属性提取,并进一步使用视图而不是更长的查询。 2) 也尽可能地标准化到它自己的列中。存储很便宜,并且存储与 JSON blob 和列相同的数据现在可以负担得起,它提供了一个补充解决方案。 您编写自己的查询并引用更适合您查询的列。

因此,基于此,我将使用 6 列:

simpleKV1String simpleKV2String simpleKV3String subKey1WithArrayInt:[1, 2, 3] 子键2: "subkey2Subkey1String": "corge", "subkey2Subkey2String": "grault", "subkey2Subkey3Int": 666 元(json blob)

同样如前所述,您可以使用 JSON blob 重新实现某些列。

【讨论】:

好的,我可以看到这是一个很好的解决方案。更重要的是,当我们在此之上添加视图时,我们可以对新的 subkey3 列执行类似的操作,而无需重新划分分区: CASE WHEN subkey3 column IS NULL then JSON_EXTRACT from json blob ELSE subkey3 column 是的,当然你也可以把它结合起来。

以上是关于BigQuery:从复杂的嵌套 JSON 键值创建列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java将复杂的动态嵌套json插入bigquery

如何从基于嵌套 json 的 BigQuery 表中进行选择?

无法使用 Spark/Scala 从 JSON 嵌套键值对创建列和值

如何在BigQuery中创建嵌套字段和数组的数组

如何从 Bigquery 中的这个嵌套 JSON 类型列中查询特定的内容

BigQuery 从 sql 数据的 json 导出加载数据