Я использую AWS Athena для запроса своих данных, и мне нужно выполнить операцию побитового сдвига влево.Как я могу реализовать это в Афине?
Больше контекста:
Я пытаюсь отслеживать события, используя побитовые операции (сдвигая биты влево, где 1 означает, что произошло мое событие, а 0 означает, что оно произошлоне).
Таким образом, цепочка 11101
будет читаться справа налево, указывая, произошло ли событие следующим образом: «Да, нет, да, да, да», где самая большая цепочка, которую я могуbuild равен MAX-размеру BIGINT, поэтому я могу отслеживать не более 63 дней
Я пытался использовать оператор <<
, как в архитектуре Hadoop / Hive, но он недоступен в Афине.
Я видел, что кто-то запрашивает это изменение, но оно не реализовано.
https://github.com/prestodb/presto/issues/4028
Я читал больше об этой теме здесь:
Что такое операторы побитового сдвига (битового сдвига) и как они работают?
Поэтому я попытался реализовать свою собственную версию некруглого побитового сдвига влево, но я не знаю, охватывает ли онвсе крайние случаи.
Это Улейкод, который я хочу «перевести» на Афину:
SELECT my_num<<1 as bit_shifted_num
FROM my_table
Это мой код:
SELECT if(CAST(my_num AS BIGINT) = 9223372036854775807 OR CAST(my_num AS BIGINT)*pow(2,1) > 9223372036854775807,from_base(rpad(substr(to_base(CAST(my_num AS BIGINT),2),2,length(to_base(CAST(my_num AS BIGINT),2))-1), length(to_base(CAST(my_num AS BIGINT),2)), '1'),2),CAST(CAST(my_num AS BIGINT)*pow(2,1) AS BIGINT)) AS bit_shifted_num
FROM my_table
Моя логическая разбивка:
- Если мой номерравно 9223372036854775807 ИЛИ мое число, умноженное на 2 (сдвиг влево на 1 бит), больше 9223372036854775807 (поскольку MAX BIGINT * 2 приводит к типу данных NUMBER, который больше, чем MAX BIGINT), преобразуйте предыдущее число в его представление STRING BIT, используяфункция to_base , подстрока этой строки, удаляющая первую цифру (считывание слева направо) и вставляющая 1 в конец строки, затем преобразующая обратно в его БОЛЬШОЕ представление INT, используя функцию from_base.
- Если число не превышает MAX BIGINT (9223372036854775807), просто умножьте его на 2, что эквивалентно сдвигу влево на 1 бит.
Я пропускаю какие-либо дела, которые рассматривает <<
от HIVE, или какая мне нужна реализация, чтобы моя функция правильно работала со смещением влево во всех случаях?