2016-04-29 74 views
1

我想將具有1.2億行的表格拆分爲Google BigQuery中的多個同等大小的表格。我找到answer這個問題,詢問有關獲取表格的行號。這個例子的解決辦法是:將表格拆分成BigQuery中的多個表格SQL

SELECT 
    ROW_NUMBER() OVER() row_number, 
    contributor_username, 
FROM (
    SELECT contributor_username, 
    FROM [publicdata:samples.wikipedia] 
    GROUP BY contributor_username 
) 

這將讓你得到一個ROW_NUMBER,然後你可以通過手動選擇

WHERE row_number BETWEEN x AND y 

這適用於本例中的表,但使用ROW_NUMBER()創建一個表爲具有117MM行的表產生資源超出錯誤。

我又試圖以下想法:

SELECT field1, field2 
    FROM (
     SELECT field1, field2, ntile(100) over (order by row_id) as ntile 
     FROM (
     SELECT hash(some_unique_key) as row_id, field1, field2 
     FROM table_with_177_MM_rows 
    ) 
) 
    WHERE ntile = 1 

那麼我需要爲NTILE =運行這個[1,...,100]。這也失敗了。有沒有辦法將GBQ中的唯一密鑰的大表拆分成更小的表?

回答

1

我的第二個例子類似上面,但是不使用NTILE窗函數:

SELECT field1, field2 
    FROM (
     SELECT hash(some_unique_key) as row_id, field1, field2 
     FROM table_with_177_MM_rows 
) 
    WHERE abs(row_id) % {n_tables} = {table_id} 

對於n_tables = 10,你會運行​​讓每個表。也許有更好的方法?

2

下面我試着表500萬行,以及對錶3個十億行和它的工作如預期

首先創建額外領域的新表(temp_table)rnd

SELECT 
    field1, field2, 
    RAND() AS rnd 
FROM YourBigTable 

比你運行下面的東西 - 取決於你想要分割多少個表 - 根據需要多次。

SELECT 
    field1, field2 
FROM temp_table 
WHERE rnd >= 0.3 AND rnd < 0.4 

當然,你應該確保你設定目標表分別

您刪除temp_table畢竟做

很難說,如果它是更好的方法或沒有,但。由你決定!

0

與上面類似,但都在一個單一的查詢中(注意:這些查詢有時會因內部錯誤而失敗,您必須重新運行它們,這是一個單獨的問題)。下面的查詢更容易通過代碼生成。

SELECT field1, field2 FROM ( SELECT field1, field2 FROM table_with_177_MM_rows WHERE hash(some_unique_key) % {n_tables} = {table_id_1} ), ( SELECT field1, field2 FROM table_with_177_MM_rows WHERE hash(some_unique_key) % {n_tables} = {table_id_2} ), .... ( SELECT field1, field2 FROM table_with_177_MM_rows WHERE hash(some_unique_key) % {n_tables} = {table_id_n} ),

+0

能否請您澄清如何'多tables'將被上面'都在一個單一的query'創建。 「多個表」是有問題的關鍵! –