[英]Scala Spark count regex matches in a file
我正在学习Spark + Scala,并且遇到了这个问题。 我有一个包含许多句子的文件,而另一个包含大量正则表达式的文件。 这两个文件每行都有一个元素。
我要计算的是每个正则表达式在整个句子文件中有多少次匹配。 例如,如果句子文件(成为数组或列表之后)由["hello world and hello life", "hello im fine", "what is your name"]
,而正则表达式文件则由["hello \\\\w+", "what \\\\w+ your", ...]
那么我希望输出为: [("hello \\\\w+", 3),("what \\\\w+ your",1), ...]
我的代码是这样的:
object PatternCount_v2 {
def main(args: Array[String]) {
// The text where we will find the patterns
val inputFile = args(0);
// The list of patterns
val inputPatterns = args(1)
val outputPath = args(2);
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
// Load the text file
val textFile = sc.textFile(inputFile).cache()
// Load the patterns
val patterns = Source.fromFile(inputPatterns).getLines.map(line => line.r).toList
val patternCounts = textFile.flatMap(line => {
println(line)
patterns.foreach(
pattern => {
println(pattern)
(pattern,pattern.findAllIn(line).length )
}
)
}
)
patternCounts.saveAsTextFile(outputPath)
}}
但是编译器抱怨:
如果我将flatMap更改为仅映射,则代码将运行,但返回一堆空元组()()()()
请帮忙! 这真让我抓狂。 谢谢,
据我所知,这里有两个问题:
您应该使用map
而不是foreach
: foreach
返回Unit
,它对集合的每个元素执行可能具有副作用的动作,它不返回新集合。 另一方面,通过将提供的函数应用于每个元素,将map
转换为一个新集合
您缺少了汇总 flatMap
结果以获取每个“键”(模式)的实际计数的部分。 这可以通过reduceByKey
轻松reduceByKey
总共-这满足您的需求:
val patternCounts = textFile
.flatMap(line => patterns.map(pattern => (pattern, pattern.findAllIn(line).length)))
.reduceByKey(_ + _)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.