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
相关产品推荐
相关产品推荐

