在 pyspark 数据帧的单个 "when" 函数中对数组的每个元素使用 OR 运算符

using OR operator for each element of an array in single "when" function of pyspark dataframe

我有一个列数组

DiversityTypes = ["ABC","EFG","LMN","XYZ"]

我想在 Pyspark 数据框上工作,我在其中创建一个名为“Is_Diversified”的新列并使用 OR 运算符设置其值 Yes ,No 上面提到的 DiversityTypes 每个元素的值,在单个 when 函数中如下:

    p_df = p_df.withColumn('Is_Diversified', f.when(f.col("ABC") == 'Y'|\
                                                    f.col("EFG") == 'Y'|\
                                                    f.col("LMN") == 'Y'|\
                                                    f.col("XYZ") == 'Y'),lit("Yes")).otherwise(lit("No")))

变成这样,我们迭代数组的每个元素并同时对其应用 OR 运算符

for diversity in DiversityTypes:
    p_df = p_df.withColumn('Is_Diversified', f.when(diversity) == 'Y'),lit("Yes")).otherwise(lit("No")))

我不能在这里应用逻辑,请帮助,谢谢:)

这个呢?制作一个数组并检查数组是否有任何 Y.

DiversityTypes = ["ABC","EFG","LMN","XYZ"]

df.withColumn('Is_Diversified', when(lit('Y').isin(*map(col, DiversityTypes)), "Yes").otherwise("No")).show()

+---+---+---+---+--------------+
|ABC|EFG|LMN|XYZ|Is_Diversified|
+---+---+---+---+--------------+
|  Y|  N|  N|  N|          true|
|  N|  N|  N|  N|         false|
|  Y|  Y|  Y|  Y|          true|
+---+---+---+---+--------------+

我会使用 functools.reducebitwise or operator:

import pyspark.sql.functions as f
from functools import reduce
from operator import or_

p_df = p_df.withColumn(
    'Is_Diversified', 
    f.when(
        reduce(
            or_, 
            [f.col(c)=="Y" for c in DiversityTypes]
        ), 
        f.lit("Yes")
    ).otherwise(f.lit("No"))
)