2016-01-11 58 views
5

是否有可能在BigQuery中創建重複的記錄列?例如,對於以下數據:BigQuery創建來自查詢的重複記錄字段

| a | b | c | 
------------- 
| 1 | 5 | 2 | 
------------- 
| 1 | 3 | 1 | 
------------- 
| 2 | 2 | 1 | 

是否有以下可能?

Select a, NEST(b, c) as d from *table* group by a 

要產生以下結果

| a | d.b | d.c | 
----------------- 
| 1 | 5 | 2 | 
----------------- 
| | 3 | 1 | 
----------------- 
| 2 | 2 | 1 | 
+0

就像你Use Legacy SQL複選框 - 我是SO(這裏只是幾個月),所以仍然在學習它周圍的一些規則相對較新的用戶 - 希望分享其中的一個:'第一你應該做的事情在閱讀某人對你的問題的回答時,就像對其他用戶(具有足夠的聲譽)進行投票一樣。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。只是想分享的情況下,如果你會喜歡的想法:o) –

回答

6

其中一種方法是去NEST()「嵌套」的限制只有一個字段是使用BigQuery User-Defined Functions。它們非常強大,但仍有一些LimitsLimitations需要注意。從我的預期最重要的是有一點 - 他們是相當候選人被認定爲貴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不兼容輸出並主要用於子查詢中的中間結果。
相反,上述方案可以很容易地直接保存到表(與選中拼合結果)

+0

對SO的重要性,您可以使用投票下面的投票答案左側的勾號標記接受的答案。見http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要 –

0

BigQuery的自動展平的查詢結果,因此,如果您使用NEST 功能上的頂級查詢,結果將不包含重複 領域。在使用產生 中間結果的子查詢時,使用NEST函數以供相同查詢立即使用。

看到https://cloud.google.com/bigquery/query-reference#aggfunctions

更多NEST()也檢查Big Query - Group By Clause not working with NEST()爲FYI

還有一點要心裏有 - 喲可以嵌套只有一個字段 - NEST(b)但不NEST(b, c)

那說 - 你可以產生類似於你問的結果,但你需要把它寫到表

從我的經驗:用戶在將數據加載到BigQuery時更多地面臨這個問題 - 也就是說,用戶可以根據需要使用nlJSON和複雜的模式。 在GBQ本身,用戶通常對分析,聚合更感興趣,因此上述類型問題的提升頻率較低。我認爲當前的GBQ sysntax不夠友好/足夠靈活,無法生成「複雜」分層/嵌套模式的數據,只能將其插入到GBQ中。儘管如此,我認爲解決方法是可能的,但取決於具體的使用案例

+0

嵌套多領域是我真正要求。 – Fardream

+1

不幸的是,我認爲'NEST(b)'現在不受支持。會很好!您可以提交您的建議 –

4

隨着引進的BigQuery標準SQL的,我們已經有了簡單的方法來處理記錄
下面嘗試,不要忘記以取消下顯示選項

WITH YourTable AS (
    SELECT 1 AS a, 5 AS b, 2 AS c UNION ALL 
    SELECT 1 AS a, 3 AS b, 1 AS c UNION ALL 
    SELECT 2 AS a, 2 AS b, 1 AS c 
) 
SELECT a, ARRAY_AGG(STRUCT(b, c)) AS d 
FROM YourTable 
GROUP BY a