2017-08-09 163 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

我剛剛編輯了我的答案,看看它現在是否適用於你。 –