Spark RDD元素转换报错:scala.MatchError异常原因咨询
问题分析与解决:Scala MatchError 排查
问题场景
你有一个类型为RDD[(Int, Seq[String])]的数据集,内容如下:
(0,List(pablo, luca)) (1,List(marco)) (3,List(anna)) (2,List(fobi))
想要把每个Int类型的键替换成对应的分类字符串,于是编写了映射逻辑,但运行后触发了scala.MatchError报错:
18/01/20 10:38:32 ERROR Executor: Exception in task 0.0 in stage 49.0 (TID 26) scala.MatchError: (0,List(pablo, luca)) (of class scala.Tuple2)
报错原因
问题出在你map操作里的模式匹配逻辑:
finalCommunitiesDetectedRdd.map{ case (id, Seq(username)) => (getNameOfBin(id), Seq(username)) }
这里的Seq(username)是专门匹配仅包含单个元素的Seq的解构模式,它会尝试把序列里的唯一元素赋值给username。但你的第一条数据(0,List(pablo, luca))里的Seq包含两个元素,完全匹配不上这个模式,Scala找不到对应的匹配分支,就抛出了MatchError。
修正方案
只需要把模式匹配改成能兼容任意长度Seq的形式就行,以下几种写法都可以:
写法1:直接接收整个Seq(推荐)
var finalCommunitiesDetectedWithNamesRdd: RDD[(String, Seq[String])] = finalCommunitiesDetectedRdd.map{ case (id, users) => (getNameOfBin(id), users) }
写法2:显式指定Seq类型(更严谨)
var finalCommunitiesDetectedWithNamesRdd: RDD[(String, Seq[String])] = finalCommunitiesDetectedRdd.map{ case (id, users: Seq[String]) => (getNameOfBin(id), users) }
修正后再运行foreach(println),就能正常输出替换后的键值对了。
内容的提问来源于stack exchange,提问作者Fobi
相关产品推荐
相关产品推荐

