【问题标题】:Apache Spark arrays fuzzy comparisonApache Spark 数组模糊比较
【发布时间】:2020-02-11 10:39:18
【问题描述】:

我有以下数据框:

function_name |   result_list
--------------------------------
     f1       |  [1,0,0,0,1,0]
     f2       |  [0,0,1,0,1,1]
     f3       |  [1,1,1,0,0,0]
     f4       |  [1,0,0,0,1,0]

result_list 列中的每个数组始终具有相同的长度。 为了找到 100% 相似的数组 - 我可以简单地将它们按 result_list 列分组。

但我还需要找到几乎相似的数组,比如等于 95% 或 90% 左右的数组。 Apache Spark 是否有可能实现它?如果是这样,请您举个例子。

【问题讨论】:

  • scala 还是 python ?
  • 对我来说无所谓,但python更可取
  • 确实很有趣的问题

标签: arrays apache-spark


【解决方案1】:

levenshtein-distance 可能是衡量相似性的合适指标:

val df : DataFrame = Seq(
  ("f1",Seq(1,0,0,0,1,0)),
  ("f2",Seq(0,0,1,0,1,1)),
  ("f3",Seq(1,1,1,0,0,0)),
  ("f4",Seq(1,1,0,0,1,0)) // very similar to f1
).toDF("function_name","result_list")


df.alias("a").join(
  df.alias("b"),
    $"a.function_name" =!= $"b.function_name"
)
.withColumn("distance",levenshtein($"a.result_list".cast("string"),$"b.result_list".cast("string")))
  .where($"distance"<=1) // similarity threshold
  // avoid duplication
  .select(sort_array(array($"a.function_name",$"b.function_name")).as("pairing"),$"distance")
  .dropDuplicates("pairing")
  .show()

给:

+--------+--------+
| pairing|distance|
+--------+--------+
|[f1, f4]|       1|
+--------+--------+

您也可以在连接条件中使用levenshtein,但随后您会丢失有关距离的信息:

df.alias("a").join(
  df.alias("b"),
    $"a.function_name" =!= $"b.function_name" and levenshtein($"a.result_list".cast("string"),$"b.result_list".cast("string")) <= 1)

【讨论】:

  • 谢谢,这很有帮助!
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多