使用pyspark根据if和else条件创建新列

时间:2019-05-23 17:00:29

标签: pyspark

我有2个spark数据帧,并且我想根据以下条件向数据帧df2中添加名为“ seg”的新列

  • 如果df1.colx中存在df2.colx值。

我尝试了以下在pyspark中的操作,但抛出异常。

cc002 = df2.withColumn('seg',F.when(df2.colx == df1.colx,"True").otherwise("FALSE"))
  • df1:
id  colx  coly
1   678   56789
2   900   67890
3   789   67854
  • df2
Name   colx
seema  900
yash   678
deep   800
harsh  900
  • 我的预期输出是
Name  colx   seg
seema 900    True
harsh 900    True
yash  678    True
deep  800    False

请帮助我纠正给定的pyspark代码或提出更好的方法。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您想做的就是这个

res = df2.join(
    df1,
    on="colx",
    how = "left"
).select(
    "Name",
    "colx"
).withColumn(
    "seg",
    F.when(F.col(colx).isNull(),F.lit(True)).otherwise(F.lit(False))
)

让我知道这是否是您想要的解决方案。

  

我的糟糕,我确实写错了代码,以下是已纠正的代码

import pyspark.sql.functions as F

df1 = sqlContext.createDataFrame([[1,678,56789],[2,900,67890],[3,789,67854]],['id', 'colx', 'coly'])

df2 = sqlContext.createDataFrame([["seema",900],["yash",678],["deep",800],["harsh",900]],['Name', 'colx'])

res = df2.join(
    df1.withColumn(
        "check",
        F.lit(1)
    ),
    on="colx",
    how = "left"
).withColumn(
    "seg",
    F.when(F.col("check").isNotNull(),F.lit(True)).otherwise(F.lit(False))
).select(
    "Name",
    "colx",
    "seg"
)

res.show()

+-----+----+-----+
| Name|colx|  seg|
+-----+----+-----+
| yash| 678| true|
|seema| 900| true|
|harsh| 900| true|
| deep| 800|false|
+-----+----+-----+

答案 1 :(得分:1)

您可以加入colx,并用False填充空值:

result = (df2.join(df1.select(df1['colx'], F.lit(True).alias('seg')), 
                   on='colx', 
                   how='left')
             .fillna(False, subset='seg'))

result.show()

输出:

+----+-----+-----+
|colx| Name|  seg|
+----+-----+-----+
| 900|seema| true|
| 900|harsh| true|
| 800| deep|false|
| 678| yash| true|
+----+-----+-----+