如何在pysppark中复制一列中值为0、另一列中值为0的行,反之亦然

neekobn8  于 2022-09-21  发布在  Spark
关注(0)|答案(2)|浏览(189)

我正在努力实现Spark源中的以下场景。有没有人能帮我一下?

源 Dataframe :

ID      Col1    Flag1   Flag2
1234    Value1  1       1
5678    Value2  0       1

预期结果:

ID      Col1    Flag1   Flag2
1234    Value1  1       0
1234    Value1  0       1
5678    Value2  0       1
lyr7nygr

lyr7nygr1#

如果您只有两个标志,您可以获取df,只过滤标志1,然后对标志2进行同样的过滤,并在两个df上执行union操作。

flag_one = df 
.withColumn("flag2", lit(0)) 
.filter(col("flag1") == 1)

flag_two = df 
.withColumn("flag1", lit(0)) 
.filter(col("flag2") == 1)

flag_one.union(flag_two).show()
kd3sttzy

kd3sttzy2#

它像魅力一样奏效,谢谢。这其中的逻辑太棒了!我有多个标志,但正如您正确地指出的那样,为了处理它们,我使用了for循环。

定义计算(Df):

for_BoW = df.select("Flag3","Flag2")
Flag1 = df
for col_name in for_BoW.columns:
    Flag1 = Flag1.withColumn(col_name, F.lit(0)).filter(F.col("Flag1") == 1)

for_Flag2 = df.select("Flag3","Flag1")
Flag2 = df
for col_name in for_Flag2.columns:
    Flag2 = Flag2.withColumn(col_name, F.lit(0)).filter(F.col("Flag2") == 1)

for_Flag3 = df.select("Flag2","Flag1")
Flag3 = df
for col_name in for_Flag3.columns:
    Flag3 = Flag3.withColumn(col_name, F.lit(0)).filter(F.col("Flag3") == 1)

output = (Flag1.union(Flag2)).union(Flag3)

return output

相关问题