Spark 中单词过滤和计数时出错

约翰·迪尔

我想定义 5 个词,并想根据这 17 个词过滤我的数据集,并计算出现次数。认为,

words = ['dog', 'cat','tiger','lion','cheetah']

我有一个文本文件,其中包含超过 2000 行的句子。我想搜索我的文本文件,并返回出现次数。

我在互联网上搜索并找到了一些代码,例如,

val filePath = sc.text_file("/user/cloudera/input/Hin*/datafile.txt")
val crimecounts =
  filePath.
    flatMap(line=>line.split(" ")).
    filter(w => (w =="dog") || (w == "lion")).
    map(word=>(word, 1)).
    reduceByKey(_ + _)

此代码为“lion”返回错误的计数。令人惊讶的是,只返回了“狮子”的计数。我已经分别使用 Python 代码检查了计数值的正确性。如何更正代码以返回所有 5 个单词的正确计数。数据子集如下,

那是一个炎热的夏日。一头狮子和一头野猪来到一个小水体喝水。狮子和野猪开始争论谁应该先喝酒。过了一会儿,当他们注意到上面有秃鹰时,他们累了,停下来喘口气。很快,他们意识到秃鹫正在等待它们中的一个或两个倒下,以享用它们。狮子和野猪于是决定,与其打架成为秃鹰的食物,还不如和好成为朋友。狮子和野猪一起喝水,然后各奔东西。

我是 Spark 的新手。任何人都可以在这方面帮助我吗?

拉梅什·马哈詹

你的代码有很多错误。阵列创建部分似乎是在pyspark但代码的其他人看起来是在斯卡拉并且sparkContext实例没有text_file api

pyspark 的解决方案

words = ['dog', 'cat','tiger','lion','cheetah']

filePath = sc.textFile("/user/cloudera/input/Hin*/datafile.txt")
from operator import add
crimecounts = filePath.flatMap(lambda line: line.split(" ")).filter(lambda w: w.lower() in words).map(lambda word: (word, 1)).reduceByKey(add)

Scala 的解决方案

val words = Array("dog","cat","tiger","lion","cheetah")

val filePath = sc.textFile("/user/cloudera/input/Hin*/datafile.txt")
val crimecounts = filePath.flatMap(line => line.split(" ")).filter(w => words.contains(w.toLowerCase)).map(word => (word, 1)).reduceByKey(_ + _)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章