AWS Athena: обработка больших чисел - PullRequest
0 голосов
/ 16 октября 2019

У меня есть файлы на S3, где два столбца содержат только положительные целые числа, которые могут быть 10^26. К сожалению, согласно Документы AWS Athena поддерживает значения только в диапазоне до 2^63-1 (приблизительно 10^19). Поэтому на данный момент эти столбцы представлены в виде строки.

Когда дело доходит до фильтрации, это не такая уж большая проблема, так как я могу использовать регулярные выражения. Например, если я хочу получить все записи между 5e^21 и 6e^21, мой запрос будет выглядеть следующим образом:

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

У меня будет приблизительно 300M строк (около 12 ГБ в паркете)и это занимает около 7 секунд, поэтому с точки зрения производительности все в порядке.

Однако иногда я хотел бы выполнить некоторые математические операции над этими двумя большими столбцами, например вычесть один большой столбец из другого. Приведение этих записей к DOUBLE не будет работать из-за ошибки аппроксимации. В идеале я бы хотел остаться в Афине. На данный момент у меня есть около 100M строк, которые больше 2^63-1, но это число может возрасти в будущем.

Что было бы правильным способом решения проблемы с числовымзаписи, которые превышают доступный диапазон? Кроме того, что вы думаете об использовании регулярных выражений для фильтрации? Есть ли лучший / более подходящий способ сделать это?

1 Ответ

2 голосов
/ 17 октября 2019

Вы можете преобразовать числа вида 5e21 в приблизительные 64-битные double или точные числовые 128-битные decimal. Сначала вам нужно удалить каретку ^ с функцией replace . Тогда будет работать простой cast:

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

или

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

Если вы будете часто заходить в эту таблицу, я бы переписал ее новым типом данных, чтобы сэкономить время обработки.

...