PySpark中如何通过二进制位运算提取指定位置的比特值
问题说明
初始参考代码如下:
>> from pyspark.sql import Row, functions >> mask = 0b10 >> test = 0b1100010 >> df = spark.createDataFrame([Row(a=mask, b=test)]) >> df.withColumn("c", df.a.bitwiseAND(df.b)).select(functions.col("c")).collect() [Row(c=2)]
需求为改造上述代码,通过二进制位运算提取变量test的第2位比特值:
- 当
test取值为0b1100010时,期望返回结果1:位与运算结果十进制为2,对应二进制为10 - 当
test取值为0b11000时,期望返回结果0:此时位与运算结果为0
此前尝试的方案存在问题:将位运算结果cast为BinaryType以获取二进制表示(test = 0b1100010时对应二进制值为10),再转换为字符串提取首字符,但执行cast转换为BinaryType时抛出异常。
运行环境版本:pyspark 2.3.0
可行实现代码
from pyspark.sql import functions as F from pyspark.sql.types import StringType, IntegerType mask = 0b10 test = 0b1100010 df = spark.createDataFrame([(mask, test)], ["a", "b"]) df = df.withColumn("bitwise", df.a.bitwiseAND(df.b)) df = df.withColumn("bitwise_str", df.bitwise.cast(StringType())) df = df.withColumn("binary", F.conv(df.bitwise_str, 10, 2)) df = df.withColumn("boolean_result", F.substring(df.binary.cast(StringType()), 0, 1).cast(IntegerType())) df.collect()
内容的提问来源于stack exchange,提问作者Mistapopo
相关产品推荐
相关产品推荐

