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