![](/img/trans.png)
[英]BigQuery "Schrödingers Row" or why ROW_NUMBER() is not a good identifier
[英]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.