【发布时间】:2022-07-02 01:09:11
【问题描述】:
我需要在pyspark数据框中更新一列(Flag,包含许多标志,每个标志是2^nint数字,加起来)在两个条件下,即column(Age)值> = 65 和列 Flag 不包含由按位或位和函数检查的新标志值:(Flag & newFlag) == 0
我已经使用示例数据框和 python 脚本演示了我的工作(请参见下文),但遇到了错误消息。
错误信息是:AnalysisException: cannot resolve '(Flag AND 2)' due to data type mismatch: '(Flag AND 2)' requires boolean type, not int;
from pyspark.sql.types import StructType,StructField, StringType, IntegerType`
from pyspark.sql.functions import *
# create a data frame with two columns: Age and Flag and three rows
data = [
(61,0),
(65,1),
(66,10) #previous inserted Flag 2 and 8, add up to 10, Flag is 2^n
]
schema = StructType([ \
StructField("Age",IntegerType(), True), \
StructField("Flag",IntegerType(), True) \
])
df = spark.createDataFrame(data=data,schema=schema)
#df.printSchema()
df.show(truncate=False)
N_FLAG_AGE65=2
new_column = when(
(col("Age") >= 65) & ((col("Flag") & lit(N_FLAG_AGE65) == 0)),
col("Flag")+N_FLAG_AGE65
).otherwise(col("Flag"))
df = df.withColumn("Flag", new_column)
df.show(truncate=False)
【问题讨论】:
-
请添加您的示例输入和预期输出数据集。它将让论坛以更好的方式了解您的用例。
标签: dataframe pyspark bitwise-operators