【发布时间】:2021-05-16 14:11:44
【问题描述】:
我有一个包含许多记录的 CSV 文件。每条记录代表某个人。它有first_name、last_name 和其他详细信息。
我的目标是以聪明的方式从这些数据中删除重复项。记录来自不同的来源,副本可能包含不同的信息。
我在下面的示例中简化了问题:
df = spark.createDataFrame(
[
(1, "Anna", "Smyth", "01/03", "NY"),
(2, "Anna", "Smyth", "01/03", ""),
(3, "Anna", "Smyth", "01/03", "NY"),
(4, "Max", "Anderson", "12/04", "Boston"),
(5, "Max", "Anderson", "", "London"),
(6, "Max", "Anderson", "06/07", ""),
(7, "Sarah", "Nicolson", "02/09", ""),
(8, "Sarah", "Jonson", "", "Mexico"),
(9, "Sarah", "Jonson", "01/08", "Dallas"),
],
("id", "first_name", "last_name", "birthday", "city")
)
df.show()
+---+----------+---------+--------+------+
| id|first_name|last_name|birthday| city|
+---+----------+---------+--------+------+
| 1| Anna| Smyth| 01/03| NY|
| 2| Anna| Smyth| 01/03| |
| 3| Anna| Smyth| 01/03| NY|
| 4| Max| Anderson| 12/04|Boston|
| 5| Max| Anderson| |London|
| 6| Max| Anderson| 06/07| |
| 7| Sarah| Nicolson| 02/09| |
| 8| Sarah| Jonson| |Mexico|
| 9| Sarah| Jonson| 01/08|Dallas|
+---+----------+---------+--------+------+
我想按first_name 和last_name 对记录进行分组,然后进行一些比较以考虑记录是否重复。
如果很少有记录具有相同的first_name 和last_name,我想检查birthday,如果它等于 - 它是重复的。
如果一个或记录有 birthday 填充,另一个 - 不是,它是重复的。如果两个(或更多)记录都有空的birthday - 它是重复的。
相比之下,我忽略了 city 字段,但是在考虑重复项时,我想留下“最富有”的记录,即填充了更多字段的记录。
如果记录具有相同的名称但不同的生日 - 它不是重复的。
例如上面,我想得到:
+---+----------+---------+--------+------+
| id|first_name|last_name|birthday| city|
+---+----------+---------+--------+------+
| 1| Anna| Smyth| 01/03| NY|
| 4| Max| Anderson| 12/04|Boston|
| 6| Max| Anderson| 06/07| |
| 7| Sarah| Nicolson| 02/09| |
| 9| Sarah| Jonson| 01/08|Dallas|
+---+----------+---------+--------+------+
在实际问题中,我有更多的字段 - 大约 70 个,其中一些应该是必须匹配的,有些则不是。我需要处理的记录数量 - 大约 1 亿条。 我正在考虑使用 pyspark,但欢迎使用任何技术
【问题讨论】:
标签: dataframe apache-spark pyspark apache-spark-sql pyspark-dataframes