在BigQuery SQL中将表拆分为多个表

时间:2016-04-29 06:58:56

标签: google-bigquery

我想将一个包含1.2亿行的表格拆分成Google BigQuery中的多个大小相同的表格。我发现这个问题是answer,询问是否要获取表的行号。示例解决方案是:

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

这适用于示例中的表,但是对于具有117MM行的表,使用ROW_NUMBER()会导致资源超出错误。

然后我尝试了以下想法:

  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中具有唯一键的大表拆分成更小的表?

3 个答案:

答案 0 :(得分:2)

我在桌面上尝试了5亿行以及桌面上有30亿行,并按预期工作

首先使用额外字段rnd

创建新表(temp_table)
SELECT
  field1, field2,
  RAND() AS rnd
FROM YourBigTable

比你运行类似下面的东西 - 取决于你想要拆分多少个表 - 根据需要多少次。

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

当然你应该确保分别设置目标表

在完成所有操作后删除temp_table

很难说是否有更好的方式。由你决定!

答案 1 :(得分: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,您可以使用table_id={0,1,2,...9}来获取每张桌子。也许有更好的方法吗?

答案 2 :(得分: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} ),