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 嵌套键值对创建列和值