我想将一个包含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中具有唯一键的大表拆分成更小的表?
答案 0 :(得分:2)
我在桌面上尝试了5亿行以及桌面上有30亿行,并按预期工作
首先使用额外字段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
很难说是否有更好的方式。由你决定!
答案 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}
),