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

Google bigquery 在BigQuery SQL中将表拆分为多个表,google-bigquery,Google Bigquery,我想在GoogleBigQuery中将一个有1.2亿行的表拆分为多个大小相等的表。我发现这是一个关于获取表的行号的问题。示例解决方案是: SELECT ROW_NUMBER() OVER() row_number, contributor_username, FROM ( SELECT contributor_username, FROM [publicdata:samples.wikipedia] GROUP BY contributor_username ) 这将允许您

我想在GoogleBigQuery中将一个有1.2亿行的表拆分为多个大小相等的表。我发现这是一个关于获取表的行号的问题。示例解决方案是:

SELECT
  ROW_NUMBER() OVER() row_number,
  contributor_username,
FROM (
  SELECT contributor_username,
  FROM [publicdata:samples.wikipedia]
  GROUP BY contributor_username
)
这将允许您获得一个行号,然后您可以通过手动选择来创建一个表

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

类似于上面的第二个示例,但不使用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}来获取每个表。也许有更好的方法吗?

我在下面的5亿行的表和30亿行的表上进行了尝试,效果如预期

首先,使用额外的字段rnd创建新的表temp\U table

然后运行下面这样的操作—取决于要拆分到的表的数量—根据需要进行多次

SELECT 
  field1, field2 
FROM temp_table
WHERE rnd >= 0.3 AND rnd < 0.4
当然,您应该确保分别设置了目标表

完成所有操作后,您将删除临时表


很难说这是不是更好的方式。由你决定

与上述类似,但都在一个查询中注意:这些类型的查询有时会因内部错误而失败,您必须重新运行它们。这是另一个问题。下面的查询更容易通过代码生成

选择字段1、字段2 从…起 选择字段1、字段2 从表_到_177_MM_行 其中hashsome_unique_key%{n_tables}={table_id_1} , 选择字段1、字段2 从表_到_177_MM_行 其中hashsome_unique_key%{n_tables}={table_id_2} , .... 选择字段1、字段2 从表_到_177_MM_行 其中hashsome_unique_key%{n_tables}={table_id_n} ,

您能否澄清,如何在一次查询中创建多个表。多个表是一个关键问题!
SELECT 
  field1, field2 
FROM temp_table
WHERE rnd >= 0.3 AND rnd < 0.4