从 sql BigQuery 中的数组对象中获取键值对

Posted

技术标签:

【中文标题】从 sql BigQuery 中的数组对象中获取键值对【英文标题】:fetch key value pairs from array objects in sql BigQuery 【发布时间】:2020-10-12 17:09:19 【问题描述】:

我需要解析列mapping 并从数组中的第二个对象中获取键值对。我想用获取的数据创建新列。数据如下所示:

row                 mapping 
1       ['adUnitCode': ca, 'id': 35, 'name': ca, 'adUnitCode': hd, 'id': 11, 'name': HD]
2       ['adUnitCode': bb, 'id': 56, 'name': jk, 'adUnitCode': hm, 'id': 12, 'name': HM]
3       ['adUnitCode': gh, 'id': 78, 'name': ff, 'adUnitCode': hk, 'id': 13, 'name': HK]

想要的输出:

row                 adUnitCode                  id                  name
1                     hd                       11                     HD
2                     hm                       12                     HM
3                     hk                       13                     HK

【问题讨论】:

映射列是什么数据类型? 映射列数据类型为STRING 只是为了仔细检查 - 假设ca 值周围没有撇号? (所以它不是来自 bq 预期的有效 json) 没有撇号。这些值不包含在撇号中。 【参考方案1】:

以下是其中一种方法(BigQuery 标准 SQL)

#standardSQL
select 
  json_extract_scalar(second_object, "$.adUnitCode") as adUnitCode,
  json_extract_scalar(second_object, "$.id") as id,
  json_extract_scalar(second_object, "$.name") as name
from `project.dataset.table`, unnest(
  [json_extract_array(regexp_replace(mapping, r"(: )(\w+)(,|)", "\\1'\\2'\\3"))[safe_offset(1)]]
) as second_object

如果将上述应用到您问题中的样本数据 - 结果是

【讨论】:

感谢您的解决方案。我已经接受了答案。如果我的数组有超过 2 个对象怎么办?有时它有 4 或 5。在这种情况下它返回所有 Null。如何修改查询以仍然从第二个对象中获取所有内容?我需要的数据总是在第二个对象中。提前谢谢你。 我的答案中的查询将始终选择第二个对象,只要它们的格式与您的问题示例中的方式相同。如果不是这种情况 - 请发布新问题以及相应的详细信息、示例,我们将很乐意为您提供进一步的帮助:o) 好的,非常感谢,它们的格式相同,唯一的区别是数组中可以包含不同数量的对象。但它始终是我需要数据的第二个对象,并且格式在整个数据集中是一致的。不知何故,当我运行代码时,我得到了 Nulls 作为回报。无论如何,我发布了新问题***.com/questions/64336882/… 以及示例数据的完整示例。

以上是关于从 sql BigQuery 中的数组对象中获取键值对的主要内容,如果未能解决你的问题,请参考以下文章

如何从 BigQuery 中的 Array(Struct) 类型数据结构中获取每个键名的值

Bigquery SQL 中的拆分函数

从 Bigquery 中的 json 获取数组

从数组中的所有对象中获取特定键的值

从 BigQuery 中的重复嵌套列中获取参数数组

从 Google BigQuery 标准 SQL 中的数组生成随机值