2016-04-29 72 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'创建。 “多个表”是有问题的关键! –