我有一个pyspark数据框,我想满足以下条件:
if col1 is not none:
if col1 > 17:
return False
else:
return True
return None
我已经通过以下方式实现了它:
out = out.withColumn('col2', out.withColumn(
'col2', when(col('col1').isNull(), None).otherwise(
when(col('col1') > 17, False).otherwise(True)
)))
但是,当我运行它时,出现以下错误:
assert isinstance(col, Column), "col should be Column"
AssertionError: col should be Column
任何想法我可能做错了。
答案 0 :(得分:3)
我认为问题出在您的错字上,写了out.withColumn
的两倍。
这是我的代码:
from pyspark.sql import functions as F
a = [
(None,),
(16,),
(18,),
]
b = [
"col1",
]
df = spark.createDataFrame(a, b)
df.withColumn(
"col2",
F.when(F.col("col1").isNull(), None).otherwise(
F.when(F.col("col1") > 17, False).otherwise(True)
),
).show()
+----+-----+
|col1| col2|
+----+-----+
|null| null|
| 16| true|
| 18|false|
+----+-----+
您也可以做一些不同的事情,因为您不需要第一个otherwise
或不需要显式评估NULL
:
df.withColumn(
"col2",
F.when(F.col("col1").isNull(), None)
.when(F.col("col1") > 17, False)
.otherwise(True),
).show()
# OR
df.withColumn(
"col2", F.when(F.col("col1") > 17, False).when(F.col("col1") <= 17, True)
).show()