AWS Athena:处理大数字

AWS Athena: Handling big numbers

我在 S3 上有文件,其中两列仅包含正整数,可以是 10^26。不幸的是,根据 AWS Docs,Athena 仅支持最大 2^63-1(大约 10^19)范围内的值。所以目前这些列被表示为一个字符串。

当谈到过滤时,这不是什么大问题,因为我可以使用正则表达式。例如,如果我想获取 5e^216e^21 之间的所有记录,我的查询将如下所示:

SELECT *
FROM database.table
WHERE (regexp_like(col_1, '^5[\d]{21}$'))

我有大约 300M 行(镶木地板大约 12GB),大约需要 7 秒,所以性能方面还可以。

但是,有时我想对这两个大列执行一些数学运算,例如从另一个大列中减去一个大列。由于近似错误,无法将这些记录转换为 DOUBLE。理想情况下,我想留在雅典娜。目前,我有大约 100M 行大于 2^63-1,但这个数字将来可能会增长。

解决数字记录超出可用范围问题的正确方法是什么?另外,您对使用正则表达式进行过滤有何看法?有 better/more 合适的方法吗?

您可以将 5e21 形式的数字转换为近似 64 位 double or an exact numeric 128bit decimal. First you'll need to remove the caret ^, with the replace 函数。然后一个简单的 cast 就可以了:

SELECT CAST(replace('5e^21', '^', '') as DOUBLE);
 _col0  
--------
 5.0E21 

SELECT CAST(replace('5e^21', '^', '') as DECIMAL);
         _col0          
------------------------
 5000000000000000000000 

如果您经常table,我会将其重写为新的数据类型以节省处理时间。