BigQuery 从 JSON 文件键中获取列

Posted

技术标签:

【中文标题】BigQuery 从 JSON 文件键中获取列【英文标题】:BigQuery get columns from JSON file keys 【发布时间】:2020-09-05 22:24:18 【问题描述】:

我面临一个与我的项目相关的问题。这是我想做的总结:

我每天有多个文件要处理(每个 2Go),其中包含以下提取(无标题):

"id":"abcdefg","key1":"key2":"audiences":"aud1":1599033396,"aud2":1599030775,"segments":"seg1":1599033245,"seg2":1599030764,"seg3":1599030764,"seg4":1599030188

我想使用 bigquery 得到这个结果:

id|audiences|segments
abcdefg|aud1|seg1
abcdefg|aud1|seg2
abcdefg|aud1|seg3
abcdefg|aud1|seg4
abcdefg|aud2|seg1
abcdefg|aud2|seg2
abcdefg|aud2|seg3
abcdefg|aud2|seg4

其中第一列包含键 id 的值,第二列和第三列包含 audiences(键)和 之间的所有可能组合细分(键)(换句话说,每个受众中包含哪些细分)。

我想这样做是为了计算每个受众的每个细分中的 id 数。

这对于一些循环和 JSON 解析是完全可行的。但是,由于我需要快速处理此问题,因此我正在考虑使用 bigquery 来完成此任务。

我有一个将文件上传到 bq 表中的第一个脚本(每行都是一个字符串)并提取字段,但我不知道如何获得最终结果。

有什么办法吗?

感谢大家的帮助。

问候

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL 
SELECT 
  JSON_EXTRACT_SCALAR(line, '$.id') id,
  TRIM(SPLIT(aud_kv, ':')[OFFSET(0)], '"') audiences,
  TRIM(SPLIT(seg_kv, ':')[OFFSET(0)], '"') segments
FROM `project.dataset.table`,
UNNEST(SPLIT(TRIM(JSON_EXTRACT(line, '$.key1.key2.audiences'),''))) aud_kv,
UNNEST(SPLIT(TRIM(JSON_EXTRACT(line, '$.key1.key2.segments'),''))) seg_kv

如果应用于您问题的样本数据 - 输出是

Row id      audiences   segments     
1   abcdefg aud1        seg1     
2   abcdefg aud1        seg2     
3   abcdefg aud1        seg3     
4   abcdefg aud1        seg4     
5   abcdefg aud2        seg1     
6   abcdefg aud2        seg2     
7   abcdefg aud2        seg3     
8   abcdefg aud2        seg4     

【讨论】:

以上是关于BigQuery 从 JSON 文件键中获取列的主要内容,如果未能解决你的问题,请参考以下文章

如何仅从一个键中过滤对象并将其作为 json 返回?

从 uknknown 数组键中提取 JSON

从 json 文件 bigquery 中提取 Json Array 元素

将 JSON 映射到数据模型,需要从动态键中获取嵌套的电子邮件值

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

BigQuery json 特殊字符 UI 导出问题