Regex 计算文本中单词的出现率-Apache Spark Scala

Regex 计算文本中单词的出现率-Apache Spark Scala,regex,scala,apache-spark,Regex,Scala,Apache Spark,我最初有一组以下格式的记录: (Title, Text) ((Word, Title), WordCount) 其中,Title是书的名称,Text是书的描述 我已经计算了每个标题的文本字段中每个单词的出现次数。其格式如下: (Title, Text) ((Word, Title), WordCount) 现在,我想从文本中计算出现单词的不同图书标题的数量。然后以以下格式存储: ((Word, Title), TitleCount) 其中Count是包含此单词的标题的数量。 我想将其存

我最初有一组以下格式的记录:

(Title, Text)
((Word, Title), WordCount)
其中,
Title
是书的名称,
Text
是书的描述

我已经计算了每个
标题的
文本
字段中每个
单词的出现次数。其格式如下:

(Title, Text)
((Word, Title), WordCount)
现在,我想从
文本
中计算出现
单词
的不同图书
标题
的数量。然后以以下格式存储:

((Word, Title), TitleCount)
其中
Count
是包含此
单词的
标题的数量。
我想将其存储在一个文件
TitleCount.txt

要计算
标题计数

val idfRdd = yourRdd.flatMap(title => (title, scala.math.log(N/(file.filter(_.split("\t")(1).contains(title.split(",")))))))
其中
N=固定号码(20)

但此代码失败,并给出错误:

scala> val idfRdd = yourRdd.flatMap(title => (title, scala.math.log(N/(file.filter(_.split("\t")(1).contains(title.split(",")))))))
<console>:31: error: value split is not a member of (String, String)
       val idfRdd = yourRdd.flatMap(title => (title, scala.math.log(N/(file.filter(_.split("\t")(1).contains(title.split(",")))))))
                                                                                                                   ^
上面的代码可以编译,但在运行时失败

标题
可能包含
“,”
,但这将是一个简单的正则表达式修复。 为了获得每个标题的单个字数,我编写了以下代码:

val file = sc.textFile("s3n://bucket/test.txt") // RDD[ String ]
val splitRdd = file.map(line => line.split("\t"))    // RDD[ Array[ String ]

val yourRdd = splitRdd.flatMap(arr => {
      val title = arr(0)
      val text = arr(1)
      val words = text.split(" ")
      words.map(word => (word, title))
    })
    // RDD[ ( String, String ) ]

val countRdd = yourRdd.map(title => (title, 1)).reduceByKey(_ + _)
countRdd.saveAsTextFile("s3n://bucket/wordcount.txt")
进一步阅读

然后,我想通过乘以两个文档中的count字段来合并这两个文档
TitleCount.txt
WordCount.txt
。 这给了我们:

FinalCount.txt

((Word, Title), WordCount * TitleCount)
它是一个实际的乘法,不是为了表示

有人能帮我解决这个问题吗?
谢谢

我猜不出您的RDD、文件等的数据类型是什么,所以我无法真正理解您最初的示例

一般来说,要解决这类问题,可以拆分为多个语句并在变量上声明数据类型,尤其是在lambdas的左侧(x:Int=>…)。然后,编译器或IDE将告诉您将在哪里误入歧途。如果您使用的是IDE,它可能有一个键盘快捷键,用于向变量添加类型声明。学习它。这是Intellij的alt enter


在这种情况下,尽管我不能理解整个代码,但错误消息告诉您,
File.filter
返回的是字符串元组的集合,而不是字符串,因此
\uu.split
对其不起作用。

这个错误确实说明了一切。定义闭包时:

val idfRdd = yourRdd.flatMap(title => (title, scala.math.log(N/(file.filter(_.split("\t")(1).contains(title.split(",")))))))
<console>:31: error: value split is not a member of (String, String)
       val idfRdd = yourRdd.flatMap(title => (title, scala.math.log(N/(file.filter(_.split("\t")(1).contains(title.split(",")))))))
如果您想要计算IDF(我不完全确定),请执行以下步骤:

  • 获取文档总数:
    var numDocs=file.count()
  • 反转拆分,使单词成为键
  • 使用aggregateByKey()获取具有[单词、数字标题]的RDD
  • 将其映射到最后的公式:
    .map(x=>(x._1,Log(numDocs/x._2.toDouble))

  • 在那里,你会得到一个RDD[(Word,IDF)]:-)

    我在下面试过,效果很好

  • 我在
    /home/cloudera/
    上创建了一个文件。(请输入您的文件位置)
  • scala>
    val rpsteam=sc.textFile(“file:///home/cloudera/RPS_Cricket_team.txt");
  • scala>
    val rpscricket=rpsteam.flatMap(lines=>lines.split(“”)。filter(value=>value==“Rahane”).map(word=>(word,1))。reduceByKey(+)
  • scala>
    rpscricket.collect()