【问题标题】:Spark - Group and Count By Similar Strings (Scala or Pyspark)Spark - 按相似字符串分组和计数(Scala 或 Pyspark)
【发布时间】:2018-11-20 23:34:32
【问题描述】:

我需要分析的 DataFrame 中有大约 1500 万个字符串。我想做的是以字符串相似性对它们进行分组。最终目标是计算相似的字符串以获得一些统计数据。以下是字符串类型的示例:

Apple
Banana
Tilamook Butter
Gala Apple
Pinto Beans
Salt
Granny Smith Apple
Generic Butter
Butter
Black Beans
Beans

我的分组看起来像这样:

Apple
Gala Apple
Granny Smith Apple
Banana
Tilamook Butter
Generic Butter
Butter
Pinto Beans
Black Beans
Beans
Salt

计数将是:

Apple - 3
Banana - 1
Butter - 3
Beans - 3
Salt- 1

我对聚类进行了一些研究,但找不到此类问题的好例子。

编辑:另外,我们应该考虑到这些字符串可能拼写错误,例如,

Butter
Bttr
Beans
Bean
Salad
Salat

【问题讨论】:

  • 您可能需要更多分类信息,而不仅仅是字符串描述。例如,“Butter Beans”需要被归类为一种 Bean,而不是一种 Butter——但你没有简单的方法来做到这一点。 (顺便说一句,计数字段应该读为Beans - 3,而不是Pinto Beans - 3?)
  • 我使用 Python 和模糊匹配做了类似的事情,基本上我提取每条记录,检查列表,如果没有匹配列表,我会用键将它添加到列表中然后检查下一个并从那里继续。不过我是在 SQL Server 中完成的,而且速度很慢。

标签: scala apache-spark cassandra pyspark


【解决方案1】:

您可以通过使用 spark 和 Scala 来做到这一点。将数据保存在文件中并使用 sparkContext 创建 RDD,如下所示。注意:sc 代表 sparkContext

val stringsRDD=sc.textFile("C:\\spark\\programs\\strings.txt")

stringsRDD 是字符串的 RDD,现在你可以遍历每个字符串并将其拆分为单词

val wordsRDD=stringsRDD.flatMap(str=>str.split(" "))

词RDD包含

res3: Array[String] = Array(Apple, Banana, Tilamook, Butter, Gala, Apple, Pinto, Beans, Salt, Granny, Smith, Apple, Generic, Butter, Butter, Black, Beans, Beans)

创建一个简单的映射,其中键是单词,值是 1

val wordMapRDD=wordsRDD.map(word=>(word->1))

单词MapRDD包含

res4: Array[(String, Int)] = Array((Apple,1), (Banana,1), (Tilamook,1), (Butter,1), (Gala,1), (Apple,1), (Pinto,1), (Beans,1), (Salt,1), (Granny,1), (Smith,1), (Apple,1), (Generic,1), (Butter,1), (Butter,1), (Black,1), (Beans,1), (Beans,1))

现在您可以轻松应用reduceByKey 功能

val wordCountRDD=wordMapRDD.reduceByKey(_+_)

单词CountRDD包含

res5: Array[(String, Int)] = Array((Tilamook,1), (Butter,3), (Salt,1), (Pinto,1), (Apple,3), (Gala,1), (Black,1), (Generic,1), (Granny,1), (Beans,3), (Smith,1), (Banana,1))

注意:如果您想查看 RDD 包含的内容,则必须使用collect 方法,如下所示

wordsRDD.collect

【讨论】:

  • 非常感谢,我会试试这个!
  • 虽然是扩展名,但如果我们有一个示例 {Butter Beans}。它会把这算作黄油和豆子,对吗?另外,如果 Butter 拼写不正确并且写成 btter 怎么办。
  • 如果你想要这样的结果,那么你必须应用 NLP。
猜你喜欢
  • 1970-01-01
  • 2019-12-17
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2019-03-03
  • 2019-10-25
相关资源
最近更新 更多