BigQuery查询嵌套JSON

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)。

还是有其他方法返回期望的结果集?

Wil*_*uks 5

这可能是您可能的解决方法:

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)