如何在aws athena/presto中实现hive的按位左移?

q0qdq0h2  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(535)

我使用aws雅典娜查询我的数据,我需要做一个位左移操作。我怎样才能在雅典娜实现这一点?
更多上下文:
我尝试使用逐位操作跟踪事件(将位向左移动,其中1表示我的事件发生,0表示它没有发生)。
所以链条 11101 将从右到左显示事件是否发生如下:“是,否,是,是,是”,其中我可以构建的最大链等于bigint的最大大小,因此我最多可以跟踪63天
我试过用接线员 << 就像在hadoop/hive架构中一样,但在雅典娜中不可用。
我看到有人要求更改,但没有执行。
https://github.com/prestodb/presto/issues/4028
我在这里读到了更多关于这个主题的内容:
什么是位移位运算符,它们是如何工作的?
所以我试着实现我自己的非循环按位左移,但我不知道它是否涵盖了所有的边缘情况。
这是我想“翻译”成雅典娜的Hive密码:

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导致数字数据类型大于max bigint),请使用函数to \u base将前一个数字转换为其字符串位表示形式,子串这个字符串删除第一个数字(从左到右读取)并在字符串的末尾插入一个1,然后使用函数从\u base转换回它的大整数表示形式。
如果该数字不大于max bigint(9223372036854775807),那么只需将其乘以2,这相当于左移1位。
我错过了Hive公司处理的案子吗 << 或者我需要什么样的实现才能使我的函数在所有情况下正确地处理左移?

tktrz96b

tktrz96b1#

通过sql实现这个函数比我提出的要复杂得多,因为一旦达到max big int值,hive就为负值增加了一点(加上presto中的一些强制转换行为,使小于max big int的值等于max big int)。
我的解决方案是将emr与aws目录一起使用,并使用hivesql在相同的表上运行查询,hivesql使用shift\u left实现了按位左移。

相关问题