问题解决:scala.MatchError: 816356 (of class java.lang.Integer)
问题场景
使用spark进行业务统计的时候,统计过程中触发这个问题,并导致程序异常退出
问题环境
- spark 1.6
- scala 2.10.6
- jdk 1.7.0_79
问题分析
首先,先看看问题报错提示的具体代码,如下:
hiveContext.createDataFrame(finalList, RowUtil.buildUserMdnSchema())
从这里,我们就可以知道,要么是finalList的参数个数或者参数类型和buildUserMdnSchema()的返参schema对不上。这里我们来具体看看schema的具体定义:
def buildUserMdnSchema(): StructType = {
val schema = types.StructType(
List(
StructField("minutes", IntegerType, false),
StructField("I_EVENT_ID", StringType, false),
StructField("i_num", IntegerType, false),
StructField("i_count_type", StringType, false),
StructField("S_FIELD_ID", StringType, false)
)
)
}
而finalList的参数呢,让我们看看主要的数据录入的代码:
result.put(one._1,Row.fromSeq(Seq(eventId,num,"3",fifldId)))
从上面两个应该可以知道,是参数个数对不上(schema指定了5个参数,而录入只有4个参数),导致数据类型错位,本来是StringType类型的eventId要被转换为IntegerType。所以提示该错误。
问题总结
编写代码的时候,逻辑要严谨,前后对应关系要梳理清楚。
浙公网安备 33010602011771号