2012-12-19 53 views
1

我BigQuery中有以下字段:的BigQuery給出響應太大誤差,整個數據集,但不等同子查詢

time,a,b,c,d 

time是在ISO8601的格式,但有一個空格的字符串,a是從1到16000的整數,其他列是字符串。該表格包含一個月的數據,每天有幾百萬條記錄。

以下查詢失敗 「的反應過大」:

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,b,c,d,count(a),count(distinct a, 1000000) 
from [myproject.mytable] 
group by day,b,c,d 
order by day,b,c,d asc 

然而,這個查詢的工作(該數據在2012-01-01開始)

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, 
    b,c,d,count(a),count(distinct a) 
from [myproject.mytable] 
where UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) = UTC_USEC_TO_DAY(PARSE_UTC_USEC('2012-01-01 00:00:00')) 
group by day,b,c,d 
order by day,b,c,d asc 

這看起來像它可能與this issue有關。但是,由於group by子句,頂級查詢等同於重複調用第二個查詢。查詢計劃員是否無法處理此問題?

編輯:

我使用我產生假的測試數據:爲了澄清我的測試數據。我最初使用了幾個字段並試圖獲得一個月的小時摘要(group by hour,其中小時是在查詢的select部分中使用as定義的)。當我失敗時,我嘗試切換到每天。當失敗時,我減少了涉及的專欄。當使用count (distinct xxx, 1000000)時,這也失敗了,但是當我剛剛做了一天的價值時它就起作用了。 (它也可以,如果我刪除1000000參數,但因爲這確實與單日查詢工作似乎查詢規劃不分離的東西,因爲我期望的那樣。)

count (distinct)的一個檢查具有基數16,000,而按列分組的基數爲2和20,總共只有1200個預期行。列值非常短,大​​約十個字符。

回答

1

您期望得到多少結果?目前允許的結果總大小限制爲64MB左右。如果你預計會有數百萬行的結果,那麼這可能是一個預期的錯誤。

如果結果數量不是非常大,可能是尺寸問題不是最終響應,而是內部計算。特別是,如果GROUP BY的結果太多,則查詢可能會耗盡內存。一種可能的解決方案是將「GROUP BY」更改爲「GOUP EACH BY」,這會改變查詢的執行方式。這是目前正在進行試驗的功能,因此尚未記錄。

您所查詢的,因爲你引用由在選擇指定的組中的字段,則可能需要這樣做:

select day, b,c,d,day,count(a),count(distinct a, 1000000) 
FROM (
    select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, b, c, d 
    from [myproject.mytable] 
) 
group EACH by day,b,c,d 
order by day,b,c,d asc 
+0

謝謝您的回答;我把我的數據放到了更多的細節上,並且我注意到了(對不起!)我沒有提到我將最大精確數提高到了不同的數。我試着按''分組',但由於其中一個分組列來自'as'('select utc_usec_to_day(time)as day'),它給了我錯誤'錯誤:查詢中使用了字段日,但是不能被發現。' – polm23

+0

這個問題可能是記憶。當您使用count(distinct xxx,1000000)時,這意味着執行引擎必須通過結果跟蹤每個組的最多100000個條目。所以如果你有1200個預期的行,你存儲爲1。需要在計算樹的根部分配2 * 10^9個值。 –

+0

我已經更新了我的答案,以解釋我是如何相信每個組都可以爲您工作的。 –

相關問題