为何得到Set[Char]而非Set[String]?Spark RDD键值对问题
问题原因与解决方案
嘿,这个问题我之前也踩过坑!其实问题出在Scala里String类型的toSet方法上。
为什么会得到Set[Char]?
Scala中的String本质上是**字符序列(Seq[Char])**的子类,当你调用toSet方法时,它会遍历字符串里的每一个字符,把它们分别作为集合的元素。所以你代码里的x.split("\t")(2).toSet,当这个字符串是"m1"时,就会被拆分成Set('m', '1'),而不是你想要的包含整个字符串的Set("m1")。
怎么修正?
你需要做的不是调用字符串的toSet,而是直接把这个字符串包装成一个Set[String]。把代码里的x.split("\t")(2).toSet改成Set(x.split("\t")(2))就可以了。
修正后的完整代码:
val newRdd = textFile.map(x => (x.split("\t")(1), Set(x.split("\t")(2)))).reduceByKey(_++_)
这样处理后,输入"1 title1 m1"会被映射成("title1", Set("m1")),经过reduceByKey(_++_)合并后,就能得到你期望的(title1, Set(m1))结果啦。
内容的提问来源于stack exchange,提问作者user3121051
相关产品推荐
相关产品推荐

