Как реализовать битовый сдвиг влево от Hive в AWS Athena / Presto? - PullRequest
0 голосов
/ 06 мая 2019

Я использую 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

Моя логическая разбивка:

  1. Если мой номерравно 9223372036854775807 ИЛИ мое число, умноженное на 2 (сдвиг влево на 1 бит), больше 9223372036854775807 (поскольку MAX BIGINT * 2 приводит к типу данных NUMBER, который больше, чем MAX BIGINT), преобразуйте предыдущее число в его представление STRING BIT, используяфункция to_base , подстрока этой строки, удаляющая первую цифру (считывание слева направо) и вставляющая 1 в конец строки, затем преобразующая обратно в его БОЛЬШОЕ представление INT, используя функцию from_base.
  2. Если число не превышает MAX BIGINT (9223372036854775807), просто умножьте его на 2, что эквивалентно сдвигу влево на 1 бит.

Я пропускаю какие-либо дела, которые рассматривает << от HIVE, или какая мне нужна реализация, чтобы моя функция правильно работала со смещением влево во всех случаях?

1 Ответ

0 голосов
/ 28 июня 2019

Реализация этой функции через SQL намного сложнее, чем я предложил, поскольку Hive добавляет бит для отрицательных значений, как только достигается значение MAX BIG INT (плюс некоторое поведение приведения в Presto делает значения меньше, чем MAX BIG INT, равным MAX BIGINT).

Мое решение заключалось в использовании EMR с каталогом AWS и выполнении запросов к тем же таблицам с использованием Hive SQL, в котором реализована битовая сдвиг влево с использованием shift_left .

...