UDF函数抛出空指针异常

时间:2017-03-10 01:30:25

标签: scala apache-spark

我有以下方法:

 class LoadService(configs: Configs, siteDataFrame:DataFrame) extends Serializable{
var serviceConfig =configs.getServiceConfig
         def insertIntoCassandra(siteMetaData: MetaData, dataFrame: DataFrame): Unit ={
            var query = cassandraUtil.buildInsertQuery(activeReplicaKeySpace, tableName, columns, sparkTempTable)
            cassandraSQLContext.sql(query)
            logger.info("Query executed")
          }
         def getSiteId: Int = {
            System.out.println("test: " + serviceConfig.getAdminKeyspace)
            return serviceConfig.getSiteId.toInt
          }
          cassandraSQLContext.udf.register("getSiteId", getSiteId _)
    }

所以另一个类调用insertIntoCassandra,然后var query有getSiteId()。因此它触发了getSiteId UDF函数,但由于某种原因,UDF函数始终具有空指针异常。如果我将serviceConfig.getSiteId.toInt放在insertIntoCassandra函数中,那个函数可以访问serviceConfig,但由于某种原因,我似乎所有的UDF函数都抛出空指针异常

serviceConfig被定义为类中的变量。 无论何时调用此函数,它都会在serviceConfig.getAdminKeySpace处抛出空指针异常。似乎serviceConfig为null。但是如果我在同一个语句中放置UDF函数之外的其他任何东西,它似乎工作。并且在此类实例化之后调用UDF函数。 UDF功能是否无法访问serviceConfig或其他内容?包含此方法的类扩展了Serializable,因此我不确定这是否会产生影响。

1 个答案:

答案 0 :(得分:0)

实际上问题就是这句话:

var serviceConfig =configs.getServiceConfig

Configs是另一个具有Configuration java对象且Configuration不可序列化的java类,因此它不能与spark一起工作,因为spark需要可序列化。