Nir*_*rKa 0 sql json nested google-bigquery
我有JSON数据,它以字符串形式保存在BigQuery中。
{
"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,
}
}
Run Code Online (Sandbox Code Playgroud)
我想要一个结果集,其中每个进程将在不同的行中。就像是:
UserID ProcessName
-------------------------
123456 outlook.exe
123456 notepad.exe
Run Code Online (Sandbox Code Playgroud)
我看到有一个查询重复数据的选项,但据我所知,该字段必须为RECORD类型。
是否可以在子查询中“即时”转换为RECORD类型?(我无法将源字段更改为RECORD)。
还是有其他方法返回期望的结果集?
这可能是您可能的解决方法:
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
Run Code Online (Sandbox Code Playgroud)
以您的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
Run Code Online (Sandbox Code Playgroud)
结果:
Row user_id processListValues
1 123456 outlook.exe
2 123456 notepad.exe
3 123456 outlo3245345okexe
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |