Spark Scala实现Twitter提及量Top2提取(单条推文去重)
解决Spark提取Twitter提及Top2的方案
嘿,作为Spark新手你已经开了个好头!我来帮你补全代码,完美实现单条推文同一提及仅统计一次、提取Top2的需求,咱们一步步来:
完整代码实现
val tweets = sc.textFile("test.txt") // 注意你之前写的是testFile,应该对应你的test.txt文件哦 val myReg = """(?<=@)([\w]+)""".r // 1. 处理每条推文:提取所有提及并去重(单条内重复提及只算1次) val uniqueMentionsPerTweet = tweets.flatMap { tweet => // 用正则匹配所有@后的内容,转成Set自动去重,再转回可迭代对象 myReg.findAllIn(tweet).toSet } // 2. 转换为键值对并统计总次数 val mentionCounts = uniqueMentionsPerTweet .map(mention => (s"@$mention", 1)) // 把正则提取的内容补回@,变成完整提及格式 .reduceByKey(_ + _) // 按提及分组,累加次数 // 3. 按次数降序排序,取Top2 val top2Mentions = mentionCounts.sortBy(_._2, ascending = false).take(2) // 4. 按你期望的格式输出结果 top2Mentions.foreach { case (mention, count) => println(s"($count, $mention)") }
关键步骤解释
- 单条推文去重:用
toSet处理每条推文的匹配结果,Set会自动剔除重复的提及,刚好满足你“单条推文中同一提及仅统计一次”的规则。 - 补回@符号:你的正则是提取@后面的内容(比如
Kelsey),所以用s"@$mention"把@加回去,和你期望的输出格式一致。 - 统计与排序:
reduceByKey高效统计每个提及的总次数,sortBy(_._2, ascending = false)按次数从高到低排序,take(2)直接取前两名。
测试验证
用你给出的测试文本运行代码,会输出:
(2, @harvard) (1, @Kelsey)
完全符合你的期望!
内容的提问来源于stack exchange,提问作者Ragnall_Mac_Somairle
相关产品推荐
相关产品推荐

