Regex Scala Spark count正则表达式在文件中匹配

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

我正在学习Spark+Scala,我被这个问题困扰着。我有一个包含许多句子的文件,还有一个包含大量正则表达式的文件。两个文件每行都有一个元素

我想要的是计算每个正则表达式在整个句子文件中有多少次匹配。例如,如果句子文件(成为数组或列表后)由
[“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(_ + _)
    

    太完美了!谢谢你让我从挫折中恢复过来。太完美了!谢谢你让我从挫折中恢复过来。