基于相似性识别重复客户(Spark Dataframe)

时间:2017-08-28 21:47:12

标签: scala apache-spark-sql cosine-similarity fuzzy-logic fuzzy-comparison

我有一个包含客户信息的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。

我确信这不是一个新问题所以我也有兴趣听其他方法。如果这是一个已解决的问题,并且已经有一个代码片段或库已经解决了这个问题,那就更好了。

0 个答案:

没有答案