繁体   English   中英

在大表上使用 ROW_NUMBER() 时出现 Google Bigquery Memory 错误 - 用短唯一标识符替换长 hash 的方法

[英]Google Bigquery Memory error when using ROW_NUMBER() on large table - ways to replace long hash by short unique identifier

对于 google BigQuery 中的查询,我想用一个较短的数字唯一标识符替换一个长的 hash,以便之后保存一些 memory,所以我这样做:

SELECT 
    my_hash
    , ROW_NUMBER() OVER (ORDER BY null) AS id_numeric
FROM hash_table_raw
GROUP BY my_hash

我什至不需要 id 中的订单,但ROW_NUMBER()需要一个ORDER BY

当我在我的数据集(> 10 亿行)上尝试此操作时,出现 memory 错误:

400 Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 126% of limit.
Top memory consumer(s):
  sort operations used for analytic OVER() clauses: 99%
  other/unattributed: 1%

还有另一种方法可以用更短的标识符替换 hash 吗?

谢谢!

执行此操作时实际上不需要填充 over 子句。

例如以下将起作用:

select col, row_number() over() as row_num from (select 'A' as col)

所以这将是你的第一次尝试。

现在,你有十亿多行:如果上面失败了:你可以做这样的事情(考虑到顺序对你来说一点都不重要):但在这里你必须分部分做:

SELECT 
    my_hash
    , ROW_NUMBER() OVER () AS id_numeric
FROM hash_table_raw
where MOD(my_hash, 5) = 0

在后续查询中:您可以从上一次运行中获取 max(id_numeric) 并将其作为偏移量添加到下一次:

SELECT 
    my_hash
    , previous_max_id_numberic_val + ROW_NUMBER() OVER () AS id_numeric
FROM hash_table_raw
where MOD(my_hash, 5) = 1

并继续将这些 mod 查询 (0-4) 的输出附加到一个新表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM