Scala中Spark Streaming共现词对输出格式问题:List转Tuple
Spark Streaming词对格式转换问题解决
你当前的问题是生成的词对用List包裹,而你需要的是二元组(Tuple)格式。问题出在combinations(2)返回的是长度为2的List,只要把这个List转换成二元组就能得到期望的输出格式。
修改后的代码
def main(args: Array[String]): Unit = { if (args.length < 1) { System.err.println("Usage: HdfsWordCount <directory>") System.exit(1) } val sparkConf = new SparkConf().setAppName("HdfsWordCount").setMaster("local") val ssc = new StreamingContext(sparkConf, Seconds(12)) val lines = ssc.textFileStream(args(0)) val words2 = lines.map(_.split("[^a-zA-Z]+").filter(str => str.length() >= 5).toList) // 把combinations生成的List转成二元组 val co_occurrence = words2.flatMap(_.combinations(2)) .map { case List(a, b) => ((a, b), 1) } .reduceByKey(_ + _) }
关键修改点
- 用模式匹配
case List(a, b)把combinations(2)生成的两元素List直接解构为二元组(a, b),再把它作为键和计数1组成新的元组((a,b),1),这是更符合Scala风格的写法。 - 如果你觉得模式匹配麻烦,也可以用索引取值替代:
.map(list => ((list(0), list(1)), 1)),效果完全一致。
修改后输出就会变成你期望的格式:
((quite, search),1)
((search, planks),1)
((quite, planks),1)
((fragile, refused),1)
((quite, second),1)
内容的提问来源于stack exchange,提问作者Eloise R
相关产品推荐
相关产品推荐

