其中一種方法是去NEST()
「嵌套」的限制只有一個字段是使用BigQuery User-Defined Functions。它們非常強大,但仍有一些Limits和Limitations需要注意。從我的預期最重要的是有一點 - 他們是相當候選人被認定爲貴High-Compute queries
複雜查詢可以 相對於處理的字節數消耗特別大的計算資源。通常,此類查詢 包含大量的JOIN或CROSS JOIN子句或複雜的用戶定義函數。
所以,下面是例子 「模擬」 NEST(B,C)從例如questino:
SELECT a, d.b, d.c FROM
JS(( // input table
SELECT a, NEST(CONCAT(STRING(b), ',', STRING(c))) AS d
FROM (
SELECT * FROM
(SELECT 1 AS a, 5 AS b, 2 AS c),
(SELECT 1 AS a, 3 AS b, 1 AS c),
(SELECT 2 AS a, 2 AS b, 1 AS c)
) GROUP BY a),
a, d, // input columns
"[{'name': 'a', 'type': 'INTEGER'}, // output schema
{'name': 'd', 'type': 'RECORD',
'mode': 'REPEATED',
'fields': [
{'name': 'b', 'type': 'STRING'},
{'name': 'c', 'type': 'STRING'}
]
}
]",
"function(row, emit){ // function
var c = [];
for (var i = 0; i < row.d.length; i++) {
x = row.d[i].toString().split(',');
t = {b:x[0], c:x[1]}
c.push(t);
};
emit({a: row.a, d: c});
}"
)
這是相對簡單的。我希望你將能夠通過它來行走,並得到一個想法
不過 - 記住:
不管你如何創建嵌套/重複場紀錄 - BigQuery的 自動展平的查詢結果,所以明顯的效果將不會包含 重複的字段。因此,您應該將其用作子查詢,生成 中間結果以供相同查詢立即使用。
正如僅供參考,你可以證明自己上面運行下面的查詢
SELECT COUNT(1) AS rows FROM (
<above query here>
)
另一個重要的注意只返回兩個記錄(而不是三個,因爲它看起來當它被壓扁等):
這是一個已知NEST()
與UnFlatten Results
不兼容輸出並主要用於子查詢中的中間結果。
相反,上述方案可以很容易地直接保存到表(與選中拼合結果)
就像你
Use Legacy SQL
複選框 - 我是SO(這裏只是幾個月),所以仍然在學習它周圍的一些規則相對較新的用戶 - 希望分享其中的一個:'第一你應該做的事情在閱讀某人對你的問題的回答時,就像對其他用戶(具有足夠的聲譽)進行投票一樣。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。只是想分享的情況下,如果你會喜歡的想法:o) –