You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala Spark流处理统计同句共现词对结果异常问题排查

共现次数统计异常问题解决方案

问题原因

  • 空格分割逻辑不合理:用split(" ")只能分割单个空格,如果文本里存在连续空格、首尾空格、制表符等空白字符,分割后会产生空字符串,就算调用trim()也无法过滤掉这些空值,会干扰后续共现统计。
  • 词对生成逻辑存在隐患:combinations(2)虽然理论上会生成所有索引递增的二元组,但部分场景下对重复元素的处理可能不符合预期,且如果你需要统计无序词对(即(How,many)和(many,How)算同一种共现),直接拼接组合结果会因为顺序不同生成不同的key,导致统计分散。

修正后代码

val lines = streamingContext.textFileStream(inputDir)

lines.foreachRDD(rdd => {
    val pairs = rdd.map(line => 
        // 用正则分割任意空白字符,过滤空字符串
        line.split("\\s+")
           .map(_.trim)
           .filter(_.nonEmpty)
           .toList
      )
      // 手动生成所有i<j的词对,逻辑完全可控
      .flatMap(wordList => {
          for {
            i <- 0 until wordList.length
            j <- i + 1 until wordList.length
          } yield {
            val w1 = wordList(i)
            val w2 = wordList(j)
            // 如果需要统计有序词对,直接写s"$w1-$w2"即可,删除排序逻辑
            val key = if (w1.compareTo(w2) < 0) s"$w1-$w2" else s"$w2-$w1"
            (key, 1)
          }
      })
      .reduceByKey(_ + _)
    
    if(!rdd.isEmpty()) {
       pairs.saveAsTextFile(output + System.currentTimeMillis())
    }
    
    pairs.collect.foreach(println)
})

效果验证

用你给出的示例输入测试,第一行How many many people die会生成2次How-many计数,第二行How many生成1次,累加后正好得到你预期的3次结果。

内容的提问来源于stack exchange,提问作者Deathnote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:45:03