PySpark 动态 When 语句

C. *_*rry 3 loops python-2.7 apache-spark pyspark

我有一个用于创建列名的字符串列表。此列表是动态的,可能会随着时间而变化。根据字符串的值,列名称会发生​​变化。我目前拥有的代码示例如下:

df = df.withColumn("newCol", \
    F.when(df.pet == "dog", df.dog_Column) \
    .otherwise(F.when(df.pet == "cat", df.cat_Column) \
    .otherwise(None))))
Run Code Online (Sandbox Code Playgroud)

我想返回列表中名称的派生列。我想做这样的事情:

dfvalues = ["dog", "cat", "parrot", "goldfish"]

df = df.withColumn("newCol", F.when(df.pet == dfvalues[0], \
     F.col(dfvalues[0] + "_Column")) 
Run Code Online (Sandbox Code Playgroud)

问题是我无法弄清楚如何在 Pyspark 中创建循环条件。

pau*_*ult 7

一种方法可能是一起选择使用列表理解了coalesce,非常相似的答案在这里

mycols = [F.when(F.col("pet") == p, F.col(p + "_Column")) for p in dfvalues]
df = df.select("*", F.coalesce(*mycols).alias("newCol"))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果是 nowhen()将返回,并将选择第一个非空列。Noneotherwise()coalesce()