考慮以下代碼:
>> 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
。結果,我想獲得 1,因為結果是以 10 為底的 2(以 2 為底的 10)。
如果變數test
現在等于0b11000
,我想獲得 0 因為在任何基數中結果都是 0...
我試圖cast
得到結果,BinaryType
以便在 base 2 中表示操作(因為test = 0b1100010
它應該是10
),將此表示形式轉換為字串 one 并提取第一個字符。cast
但是我在嘗試to時遇到了例外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()
uj5u.com熱心網友回復:
您可以使用 Spark 的bit_get
(索引從 0 開始,因此第 2 位由索引 1 參考)
bit_get(a & b, 1)
從二進制運算中獲取第二位a & b
:
from pyspark.sql import functions as F
mask = 0b10
test = 0b1100010
df = spark.createDataFrame([(mask, test)], ["a", "b"])
df.select(F.expr("bit_get(a & b, 1)").alias("c")).collect()
# [Row(c=1)]
(expr
需要,因為bit_get
在 PySpark 中還沒有直接可用。)
從已經存在的列中獲取位甚至更簡單:bit_get(b, 1)
uj5u.com熱心網友回復:
將 c 列轉換為字串,然后使用conv函式移至基數 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/488046.html
標籤:python-3.x 阿帕奇火花 pyspark apache-spark-sql 二进制
上一篇:根據其值在新列中連接列名
下一篇:com.google.cloud.spark.bigquery.repackaged.com.google.cloud.bigquery.BigQueryException:連接重置