我有以下方法:
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,因此我不确定这是否会产生影响。
答案 0 :(得分:0)
实际上问题就是这句话:
var serviceConfig =configs.getServiceConfig
Configs是另一个具有Configuration java对象且Configuration不可序列化的java类,因此它不能与spark一起工作,因为spark需要可序列化。