我有一个包含客户信息的spark数据框。有些客户端是重复的,但计算机很难确定没有某种形式的模糊匹配,如levenstein距离等。
在下面的示例中,John Smith和Johnny Smith是同一个人,但他们的“first_name”和“address”字段略有不同。其他细节如生日和电话号码可能不一定存在。因此,我只能识别具有一定概率的同一个人。
+----------+---------+-----------------------+-------------------+------------+-----------+
|first_name|last_name|birthdate |address |phone_number|client_uuid|
+----------+---------+-----------------------+-------------------+------------+-----------+
|John |Smith |1998-01-01 12:29:42.835|123 Bakersville |555-555-5555|null |
|Jay |Leno |1955-11-12 12:30:12.946|null |null |null |
|Johnny |Smith |null |123 Bakersville St.|null |null |
+----------+---------+-----------------------+-------------------+------------+-----------+
假设我想尝试尝试解决这个问题。我希望我的最终结果填写最后一个字段“client_uuid”。我理想的结果将是这样的:
+----------+---------+-----------------------+-------------------+------------+-----------+
|first_name|last_name|birthdate |address |phone_number|client_uuid|
+----------+---------+-----------------------+-------------------+------------+-----------+
|John |Smith |1998-01-01 12:29:42.835|123 Bakersville |555-555-5555|CLIENT_123 |
|Jay |Leno |1955-11-12 12:30:12.946|null |null |CLIENT_456 |
|Johnny |Smith |null |123 Bakersville St.|null |CLIENT_123 |
+----------+---------+-----------------------+-------------------+------------+-----------+
我意识到这不是一个容易出问题的问题,而是在努力解决许多小问题。事实上,如果有人找到Spark DF的解决方案,这不是Spark数据帧问题,而是奖励积分。
我正在考虑的解决方案是将每个客户记录转换为向量,然后我可以使用余弦相似性来确定每条记录彼此之间的相似程度。如果它们在某个阈值内,那么我将为它们分配相同的生成UUID。
我确信这不是一个新问题所以我也有兴趣听其他方法。如果这是一个已解决的问题,并且已经有一个代码片段或库已经解决了这个问题,那就更好了。