在Spark

时间:2018-02-17 09:23:50

标签: apache-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的新手。谁可以在这方面帮助我?

1 个答案:

答案 0 :(得分:3)

您的代码中存在很多错误。 数组创建部分似乎位于 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(_ + _)