如何解决如何使用哈希md5方法在pyspark数据帧中查找重复项?
我有两个输入数据框,如下所示,我想使用散列方法查找重复的行。
输入数据帧1:df1
|a |b |c |
|5 |2 |3 |
|1 |5 |4 |
|1 |5 |3 |
输入数据框2:df2
|a |b |c |
|5 |2 |3 |
|5 |2 |3 |
|1 |5 |4 |
|1 |5 |3 |
准备col_list并在输入列中查找哈希
col_list = ['a','b','c']
df1 = df1.withColumn("hash",md5(concat_ws('+',*col_list)))
df2 = df2.withColumn("hash",*col_list)))
upd: df1 upd: df2
|a |b |c |hash | |a |b |c |hash |
|5 |2 |3 |sfsd23| |5 |2 |3 |sfsd23|
|1 |5 |4 |fsd345| |5 |2 |3 |sfsd23|
|1 |5 |3 |54sgsr| |1 |5 |4 |fsd345|
|1 |5 |3 |54sgsr|
df_diff = df1.select(df1.hash).substract(df2.select(df2.hash))
df_diff.show()-没事
由于哈希与df1中的1条哈希值记录匹配,而df2中具有相同哈希值的2条记录相同,因此未显示差异。 但是,如何在此之后找到重复项,然后我想在发现错误后再次提出该错误。
解决方法
使用 .exceptAll
(来自Spark-2.4 +),而不是.substract
,因为.exceptAll
使用df2保留了所有重复的行作为源数据框。
From docs:
Return a new DataFrame containing rows in this DataFrame but not in another DataFrame.
This is equivalent to EXCEPT DISTINCT in SQL.
Return a new DataFrame containing rows in this DataFrame but not in another DataFrame while preserving duplicates.
This is equivalent to EXCEPT ALL in SQL.
Example:
From Spark-2.4+:
df2.exceptAll(df1).show(10,False)
#+---+---+---+--------------------------------+
#|a |b |c |hash |
#+---+---+---+--------------------------------+
#|5 |2 |3 |747d9c66398e89fbda6570f6bf945ed6|
#+---+---+---+--------------------------------+
For Spark<2.4:
我们需要在 window row_number functi
上使用Spark ,然后左联接以查找重复的记录。
Example:
from pyspark.sql.functions import row_number
from pyspark.sql import Window
w=Window.partitionBy(*['a','b','c','hash']).orderBy(lit(1))
df1=df1.withColumn("rn",row_number().over(w))
df2=df2.withColumn("rn",row_number().over(w))
df2.alias("d2").join(df1.alias("d1"),(df1["a"]==df2["a"]) & (df1["b"]==df2["b"]) & (df1["c"]==df2["c"]) & (df1["hash"]==df2["hash"]) & (df1["rn"]==df2["rn"]),'left').\
filter(col("d1.rn").isNull()).\
select("d2.*").\
drop("rn").\
show()
#+---+---+---+--------------------------------+
#|a |b |c |hash |
#+---+---+---+--------------------------------+
#|5 |2 |3 |747d9c66398e89fbda6570f6bf945ed6|
#+---+---+---+--------------------------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。