我有以下方法:
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自定义函数,但由于某些原因,自定义函数总是有空指针异常。如果我将serviceConfig.getSiteId.toInt放在insertIntoCassandra函数中,该函数可以访问serviceConfig,但由于某些原因,我所使用所有UDF函数似乎都抛出了空指针异常
serviceConfig被定义为类中的一个变量。每当调用此函数时,它都会在serviceConfig.getAdminKeySpace处抛出空指针异常。serviceConfig似乎为空。但是,如果我把同样的语句放在UDF函数之外,放在类中的任何其他地方,它似乎都可以工作。并且UDF函数也是在这个类被实例化之后调用的。是不是自定义函数不能访问serviceConfig或其他什么?包含此方法的类扩展了Serializable,所以我不确定这是否会有所不同。
发布于 2017-03-11 04:24:20
实际上,问题就是这句话:
var serviceConfig =configs.getServiceConfigConfigs是另一个具有配置java对象的java类,而Configuration是不可序列化的,因此它不能与spark一起工作,因为spark需要可序列化。
https://stackoverflow.com/questions/42708570
复制相似问题