如何在pyspark中写嵌套

时间:2020-10-12 13:15:35

标签: pyspark

我有一个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

任何想法我可能做错了。

1 个答案:

答案 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()