如何在Spark SQL中实现类似bit_and的位与功能?
Spark SQL 替代 Presto bit_and 的实现方案
方案1:用位与运算符 & 直接实现
Spark SQL支持原生位与运算符&,可以直接替换你原有的逻辑,代码如下:
case when (cast(sm.numbermask as int) & 32) = 32 then true else false end AS abc_flag
嫌写case when麻烦的话,还能进一步简化——因为比较结果本身就是布尔值:
(cast(sm.numbermask as int) & 32) = 32 AS abc_flag
方案2:用Spark内置函数 bitwise_and()
如果你更习惯用函数形式,Spark提供了和Presto bit_and功能完全一致的bitwise_and(a, b)函数,代码示例:
case when bitwise_and(cast(sm.numbermask as int), 32) = 32 then true else false end AS abc_flag
同样可以简化为:
bitwise_and(cast(sm.numbermask as int), 32) = 32 AS abc_flag
注意事项
- 两种方案效果完全相同,选顺手的写法即可
- 如果
sm.numbermask的数值范围较大,建议把int换成bigint避免溢出
内容的提问来源于stack exchange,提问作者Novi
相关产品推荐
相关产品推荐

