BigQuery 查询嵌套 json
Posted
技术标签:
【中文标题】BigQuery 查询嵌套 json【英文标题】:BigQuery query nested json 【发布时间】:2017-08-09 08:15:49 【问题描述】:我有以字符串形式保存在 BigQuery 中的 JSON 数据。
"event":
"action":"prohibitedSoftwareCheckResult",
"clientTime":"2017-07-16T12:55:40.828Z",
"clientTimeZone":"3",
"serverTime":"2017-07-16T12:55:39.000Z",
"processList":
"1":"outlook.exe",
"2":"notepad.exe"
,
"user":
"id":123456,
我想要一个结果集,其中每个进程将位于不同的行中。 比如:
UserID ProcessName
-------------------------
123456 outlook.exe
123456 notepad.exe
我看到有一个查询重复数据的选项,但据我了解,该字段需要是 RECORD 类型。
是否可以在子查询中“即时”转换为 RECORD 类型? (我无法将源字段更改为 RECORD)。
或者,有没有其他方法可以返回所需的结果集?
【问题讨论】:
"processList" 这里不是重复字段,而是一条记录。如果它是一个重复的字段,它应该是一个像"processList: ["outlook.exe", "notepad.exe"]
这样的数组。事实上,我想获得你的结果需要首先知道 processList 中的所有键(例如“1”、“2”等)
这实际上是动态的,但是是连续的 (1,2,3..N)。对于不同的 json,我可以有不同数量的进程。也许我应该以某种方式旋转(展平)它然后取消旋转它?
【参考方案1】:
这对您来说可能是一种解决方法:
SELECT
user_id,
processListValues
FROM(
SELECT
JSON_EXTRACT_SCALAR(json_data, '$.user.id') user_id,
REGEXP_EXTRACT_ALL(JSON_EXTRACT(json_data, '$.event.processList'), r':"([a-zA-Z0-9\.]+)"') processListValues
FROM data
),
UNNEST(processListValues) processListValues
以您的 JSON 为例:
WITH data AS(
SELECT """
"event":
"action":"prohibitedSoftwareCheckResult",
"clientTime":"2017-07-16T12:55:40.828Z",
"clientTimeZone":"3",
"serverTime":"2017-07-16T12:55:39.000Z",
"processList":
"1":"outlook.exe",
"2":"notepad.exe",
"3":"outlo3245345okexe"
,
"user":
"id":123456,
""" as json_data
)
SELECT
user_id,
processListValues
FROM(
SELECT
JSON_EXTRACT_SCALAR(json_data, '$.user.id') user_id,
REGEXP_EXTRACT_ALL(JSON_EXTRACT(json_data, '$.event.processList'), r':"([a-zA-Z0-9\.]+)"') processListValues
FROM data
),
UNNEST(processListValues) processListValues
结果:
Row user_id processListValues
1 123456 outlook.exe
2 123456 notepad.exe
3 123456 outlo3245345okexe
【讨论】:
谢谢!这看起来是个不错的方法。我应该如何处理这样的过程:“3”:“outlo3245345okexe”?它会将其分成两行... 我刚刚编辑了我的答案。看看它现在是否适合你。以上是关于BigQuery 查询嵌套 json的主要内容,如果未能解决你的问题,请参考以下文章