Google bigquery 在BigQuery SQL中将表拆分为多个表
我想在GoogleBigQuery中将一个有1.2亿行的表拆分为多个大小相等的表。我发现这是一个关于获取表的行号的问题。示例解决方案是: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 ) 这将允许您
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