【问题标题】:Split a table into multiple tables in BigQuery SQL在 BigQuery SQL 中将一个表拆分为多个表
【发布时间】:2016-08-24 05:10:35
【问题描述】:

我想在 Google BigQuery 中将一个包含 1.2 亿行的表拆分为多个大小相同的表。我发现这个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

这适用于示例中的表,但使用 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中带有唯一键的大表拆分成小表?

【问题讨论】:

    标签: google-bigquery


    【解决方案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】:

      我在下面尝试了 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

      很难说这是否是更好的方法。由你决定!

      【讨论】:

        【解决方案3】:

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

        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} ),

        【讨论】:

        • 您能否澄清一下multiple tables 将如何由上面的all in one single query 创建。 Multiple Tables 是有问题的关键!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 2020-05-27
        相关资源
        最近更新 更多