使用 pyspark 基于 if 和 else 条件创建新列

Posted

技术标签:

【中文标题】使用 pyspark 基于 if 和 else 条件创建新列【英文标题】:New column creation based on if and else condition using pyspark 【发布时间】:2019-05-23 17:00:29 【问题描述】:

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

如果 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 代码或提出更好的方法。

【问题讨论】:

【参考方案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|
+-----+----+-----+

【讨论】:

不幸的是,加入后我得到 0 条空值记录(真实计数为 0)【参考方案2】:

您可以加入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|
+----+-----+-----+

【讨论】:

@Tilo 哪个数据类型? 在我的代码中“colx”是一个“标识符(ID)”并且是字符串类型。我尝试使用您提供的解决方案。但它给出了例外 @Tilo 不应该有所作为。什么例外?

以上是关于使用 pyspark 基于 if 和 else 条件创建新列的主要内容,如果未能解决你的问题,请参考以下文章

VBA If / Then基于记录计数

If Else, Else If, Else - 基于 URL 中的字符串

Go if else

if-else 语句

if...else

第12条:不要在for和while循环后面写else块