如何交叉/联合不同值的pyspark数据帧



我有一个数据帧作为(这是整体数据帧)与0和1

+---+-----+                                                                     
|key|value|
+---+-----+
|  a|  0.5|
|  b|  0.4|
|  c|  0.5|
|  d|  0.3|
|  x|  0.0|
|  y|  0.0|
|  z|  0.0|
+---+-----+

,第二个数据帧是(坏输出)(应该只包含0)

+---+-----+
|key|value|
+---+-----+
|  a|  0.0|
|  e|  0.0|
|  f|  0.0|
|  g|  0.0|
+---+-----+
Note : the value of `a` has chnaged

如何编写我的脚本,这样我就可以得到我的第二个数据帧的以下输出(只有0和a的值是1在良好的数据帧,我想从坏的一个删除它

+---+-----+
|key|value|
+---+-----+
|  e|  0.0|
|  f|  0.0|
|  g|  0.0|
|  x|  0.0|
|  y|  0.0|
|  z|  0.0|
+---+-----+

可以从不良输出中删除非零的总体值,并添加零总体值(Scala):

val overall = Seq(
("a", 0.5),
("b", 0.4),
("c", 0.5),
("d", 0.3),
("x", 0.0),
("y", 0.0),
("z", 0.0),
).toDF("key", "value")
val badOutput = Seq(
("a", 0.0),
("e", 0.0),
("f", 0.0),
("g", 0.0)
)
.toDF("key", "value")
badOutput
.except(overall.where($"value"=!=0).withColumn("value", lit(0.0)))
.union (overall.where($"value"===0))

可以用groupBy+array_contains函数合并两个数据帧来得到想要的结果。

Example:

df.show()
#+---+-----+
#|key|value|
#+---+-----+
#|  a|    1|
#|  b|    1|
#|  c|    1|
#|  d|    1|
#|  x|    0|
#|  y|    0|
#|  z|    0|
#+---+-----+
df1.show()
#+---+-----+
#|key|value|
#+---+-----+
#|  a|    0|
#|  e|    0|
#|  f|    0|
#|  g|    0|
#+---+-----+
df2=df.unionAll(df1)
df3=df2.groupBy("key").agg(collect_list(col("value")).alias("lst"))
df3.filter(~array_contains("lst",1)).
withColumn("lst",array_join(col("lst"),'')).
show()
#+---+---+
#|key|lst|
#+---+---+
#|  x|  0|
#|  g|  0|
#|  f|  0|
#|  e|  0|
#|  z|  0|
#|  y|  0|
#+---+---+

最新更新