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()代码>