【问题标题】:Error during filtering and counting of words in SparkSpark中单词过滤和计数时出错
【发布时间】:2018-02-18 12:06:49
【问题描述】:

我想定义 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(_ + _)

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

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

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

【问题讨论】:

  • 你能用一小部分数据重现问题吗?您使用此代码获得的计数是多少?另外,您使用的是 Python 还是 Scala?
  • 我正在使用 spark-shell。我擅长 Python,所以我构建了一个代码来测试正确性,file.read().lower(), and use count() function Python 与此代码没有任何联系。我通过编辑添加了数据子集。我将 Lion 计数设为 2,而一小部分数据本身的 Lion 计数为 4。
  • 您已将其标记为 pyspark,但同时使用了 scala 和 pyspark 的代码。请验证
  • 看不到任何 Python 代码 - 为什么将其标记为 pyspark
  • @desertnaut 我是 Spark 的新手,所以我不知道哪个标签合适

标签: apache-spark


【解决方案1】:

您的代码中有很多错误。 数组创建部分 似乎在 pyspark 中,但其余代码似乎在 scala 中。并且 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(_ + _)

【讨论】:

  • 感谢您的回答。我还有2个疑问。请不要犹豫回答。假设,如果还有另外 59 个这样的文件,并且我想要所有文件中每个单词的总计数,我应该怎么做?另一个问题是,当我从文件中读取数据时,如何使其不区分大小写并运行文件?感谢您,根据您的命令,没有出现错误。但是正在生成一个空的 RDD。我已经交叉检查了 HDFS 中是否存在数据。
  • 我正在使用 Cloudera 发行版的 Quickstart VM,所以我猜它已经设置好了。
  • 当我尝试在 PySpark 中打印文件时,所有单词都以“\xa0”为前缀,我猜这与编码有关。这会导致任何问题吗?
  • 回答您的问题:1)您只需提供目录路径,其中的所有文件都会被读取。 2)您可以将所有单词更改为小写或使用igoreCase()。 3)hadoop配置有问题并将其链接到spark。 4) 文本文件中可能有一些符号。
猜你喜欢
  • 2021-09-12
  • 2019-03-07
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多