2017-08-09 125 views
0

我有JSON数据保存在BigQuery中作为字符串。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)。

或者,有没有不同的方式来返回所需的结果集?

+0

“PROCESSLIST” 这里是不是重复而是一个记录。因为它是一个重复的字段,它应该是一个像''processList:[“outlook.exe”,“notepad.exe”]这样的数组。我想,得到你的结果需要首先知道processList中的所有键如“1”,“2”等) –

+0

这实际上是动态的,但顺序的(1,2,3..N)。 我可以有不同数量的进程为不同的jsons。 也许我应该不知怎的,它枢轴(扁平化),然后解除它? – NirKa

回答

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  
+0

谢谢!看起来像一个很好的方法。 我应该如何处理这样的过程:“3”:“outlo3245345okexe”? 它会把它分成两行... – NirKa

+0

我刚刚编辑了我的答案,看看它现在是否适用于你。 –