Pyspark 当一列中的值位于另一列中时标记数据

Pyspark 当一列中的值位于另一列中时标记数据,pyspark,data-wrangling,Pyspark,Data Wrangling,我试图根据两个条件在数据集中创建一个标志,第一个条件很简单。Dos CheckingCol=CheckingCol2 第二个更复杂。我有一个名为TranID的列和一个名为RevID的列 对于任何行,如果RevID在TranID中且CheckingCol=CheckingCol2,则标志应返回“是”。否则,该标志应返回“否” 我的数据如下所示: TranID RevID CheckingCol CheckingCol2 1 2 ABC ABC

我试图根据两个条件在数据集中创建一个标志,第一个条件很简单。Dos CheckingCol=CheckingCol2

第二个更复杂。我有一个名为TranID的列和一个名为RevID的列

对于任何行,如果RevID在TranID中且CheckingCol=CheckingCol2,则标志应返回“是”。否则,该标志应返回“否”

我的数据如下所示:

TranID   RevID   CheckingCol  CheckingCol2
1        2       ABC          ABC
2        1       ABC          ABC
3        6       ABCDE        ABCDE
4        3       ABCDE        ABC
5        7       ABCDE        ABC

预期结果将是:

TranID   RevID   CheckingCol  CheckingCol2  Flag
1        2       ABC          ABC           Yes
2        1       ABC          ABC           Yes
3        6       ABCDE        ABCDE         No
4        3       ABCDE        ABC           No
5        7       ABCDE        ABC           No

我试过使用:

df.withColumn("TotalMatch", when((col("RevID").contains(col("TranID"))) & (col("CheckingColumn") == col("CheckingColumn2")), "Yes").otherwise("No"))
但它不起作用,而且我也无法在网上找到任何关于如何做到这一点的信息


任何帮助都会很好

从TranID列获取数组的唯一值,然后使用isIn()函数检查该数组中的RevID


注意:检查RevID和TranID列中的NULL和NoneType值,因为它们会影响结果

从TranID列获取唯一值作为数组,然后使用isIn()函数检查该数组中的RevID


注意:检查RevID和TranID列中的空值和非类型值,因为它们会影响结果,而不是
“Yes”
,而不是
“Yes”
,而
F.lit(“No”)
而不是
“No”
@pault contains确实起作用,但我意识到问题是OP有一个父子类型的问题,在
TranID
RevID
之间,这就是前两行被标记为
Yes
@pault的原因。因此,在我的拙见中,我不认为它是重复的
F.lit(“Yes”)
而不是
“Yes”
F.lit(“No”)
而不是
“No”
@pault包含的内容起作用,但我意识到问题是OP有一个父子类型的问题,介于
TranID
RevID
之间,这就是为什么前两行被标记为
Yes
@pault的原因。因此,在我看来,我不认为它是重复的

from pyspark.sql import functions as sf
unique_values = df1.agg(sf.collect_set("TranID").alias("uniqueIDs"))
unique_values.show()
+---------------+
|       uniqueIDs|
+---------------+
|[3, 1, 2, 5, 4]|
+---------------+

required_array = unique_values.take(1)[0].uniqueIDs
['3', '1', '2', '5', '4']

df2 = df1.withColumn("Flag", sf.when( (sf.col("RevID").isin(required_array) & (sf.col("CheckingCol") ==sf.col("CheckingCol2")) ) , "Yes").otherwise("No"))