问题解决:scala.MatchError: 816356 (of class java.lang.Integer)

问题场景

使用spark进行业务统计的时候,统计过程中触发这个问题,并导致程序异常退出

问题环境

  1. spark 1.6
  2. scala 2.10.6
  3. 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。所以提示该错误。

问题总结

编写代码的时候,逻辑要严谨,前后对应关系要梳理清楚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章