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的主要内容,如果未能解决你的问题,请参考以下文章

bigquery 嵌套和重复字段查询

在 BigQuery 中嵌套查询结果 [重复]

BigQuery - 相关子查询取消嵌套数组不起作用

BigQuery - 具有不同 WHERE 参数的嵌套查询?

Bigquery 表嵌套多值列在查询时出错

如何查询非规范化 BigQuery 表以输出嵌套和重复的字段