Regex Scala Spark count正则表达式在文件中匹配
我正在学习Spark+Scala,我被这个问题困扰着。我有一个包含许多句子的文件,还有一个包含大量正则表达式的文件。两个文件每行都有一个元素 我想要的是计算每个正则表达式在整个句子文件中有多少次匹配。例如,如果句子文件(成为数组或列表后)由Regex Scala Spark count正则表达式在文件中匹配,regex,scala,apache-spark,Regex,Scala,Apache Spark,我正在学习Spark+Scala,我被这个问题困扰着。我有一个包含许多句子的文件,还有一个包含大量正则表达式的文件。两个文件每行都有一个元素 我想要的是计算每个正则表达式在整个句子文件中有多少次匹配。例如,如果句子文件(成为数组或列表后)由[“hello world and hello life”,“hello i m fine”,“what is your name”]表示,而正则表达式文件由[“hello\\w+”,“what\\w+your”,…]表示,那么我希望输出类似:[(“hello
[“hello world and hello life”,“hello i m 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
,它执行的操作对集合的每个元素都有潜在的副作用,但不返回新集合<代码>映射另一方面,通过将提供的函数应用于每个元素,将集合转换为新集合flatMap
的结果聚合以获得每个“键”(模式)的实际计数的部分。使用reduceByKey
val patternCounts = textFile
.flatMap(line => patterns.map(pattern => (pattern, pattern.findAllIn(line).length)))
.reduceByKey(_ + _)
据我所知,这里有两个问题:
map
而不是foreach
:foreach
返回Unit
,它执行的操作对集合的每个元素都有潜在的副作用,但不返回新集合<代码>映射另一方面,通过将提供的函数应用于每个元素,将集合转换为新集合flatMap
的结果聚合以获得每个“键”(模式)的实际计数的部分。使用reduceByKey
val patternCounts = textFile
.flatMap(line => patterns.map(pattern => (pattern, pattern.findAllIn(line).length)))
.reduceByKey(_ + _)
太完美了!谢谢你让我从挫折中恢复过来。太完美了!谢谢你让我从挫折中恢复过来。