我有JSON格式的數據,其中嵌套數組。下面是一個例子:將嵌套數組加載到bigquery中
"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963],...
子陣列的長度可以是3或4,並且所述第一數量的數據類型(有大約30種不同的)。有沒有辦法將這些數據加載到bigQuery而不轉換成字典的「記錄」?
感謝, 亞龍
- 編輯 -
有this問題,即有一個解決辦法,但有一個固定長度的子陣,所以不適用我想..
我有JSON格式的數據,其中嵌套數組。下面是一個例子:將嵌套數組加載到bigquery中
"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963],...
子陣列的長度可以是3或4,並且所述第一數量的數據類型(有大約30種不同的)。有沒有辦法將這些數據加載到bigQuery而不轉換成字典的「記錄」?
感謝, 亞龍
- 編輯 -
有this問題,即有一個解決辦法,但有一個固定長度的子陣,所以不適用我想..
無法直接加載數組數組;您需要使用記錄來包裝數組的內層。標準SQL的參考涉及到這一點(儘管在語言本身方面,沒有加載數據):https://cloud.google.com/bigquery/sql-reference/arrays#building-arrays-of-arrays。
感謝您的回答。我試圖避免必須對數據進行轉換才能將其轉化爲記錄/結構。有沒有辦法上傳這個嵌套數組作爲字符串/文本blob? – WeaselFox
這個過去的問題可能會有所幫助:http://stackoverflow.com/questions/37660579/bigquery-create-column-of-json-datatype你可以將它加載爲一個字符串,然後使用BigQuery的JSON函數來提取你想要的部分作爲查詢的一部分。 –
這可能是錯誤的方向,因爲它是不完全清楚什麼是你的最終目標,但讓我儘量幫你
不知怎的,我覺得你的目標表有望成爲類似下面
type metric1 metric2 metric3
1 1271 518 945
1 1287 495 963
所以,我的建議是讓你的兩個步驟
步驟1 - 只需一個字段加載數據作爲CSV - 假設表theTable
與現場data
data
{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}
{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}}
第二步 - 過程theTable
產生預期的架構(請參閱對答案的頂部)和保存到決賽桌。您可以使用下面的查詢該
SELECT
NTH(1, SPLIT(y)) AS type,
NTH(2, SPLIT(y)) AS metric1,
NTH(3, SPLIT(y)) AS metric2,
NTH(4, SPLIT(y)) AS metric3,
FROM (
SELECT
REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y
FROM (
SELECT
IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
FROM theTable AS a
CROSS JOIN (
SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k),
(SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
) AS b
)
HAVING NOT y IS NULL
)
其結果將是
type metric1 metric2 metric3
1 1271 518 945
1 1287 495 963
2 111 222 333
3 444 555 666
4 777 888 999
正如你所看到的 - 這個特定的查詢多達7次陣列支持,但是你可以減少或改變增加此在三個地方
#1
REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y
#2
0碼IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
#3
SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k),
(SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
最後,測試只是轉換邏輯,W/O負載的實際數據 - 您可以使用下面的腳本
SELECT
NTH(1, SPLIT(y)) AS type,
NTH(2, SPLIT(y)) AS metric1,
NTH(3, SPLIT(y)) AS metric2,
NTH(4, SPLIT(y)) AS metric3,
FROM (
SELECT
REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y
FROM (
SELECT
IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
FROM (
SELECT data FROM
(SELECT '{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}' AS data),
(SELECT '{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}}' AS data)
) AS a
CROSS JOIN (
SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k),
(SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
) AS b
)
HAVING NOT y IS NULL
)
希望這是有幫助的!
Upvote夢幻般的邏輯和努力 – BigDaddy
目前尚不清楚預期的最終表 - 舉例說明! –
重要的是,您可以使用投票下方發佈的答案左側的勾號標記接受的答案。請參閱http://meta.stackexchange。com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要。答案投票也很重要。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。 –