2017-03-10 220 views
0

我有以下方法:UDF函数抛出空指针异常

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查询有getSiteId()。因此它会触发getSiteId UDF函数,但由于某些原因,UDF函数始终具有空指针异常。如果我将serviceConfig.getSiteId.toInt放入insertIntoCassandra函数中,该函数可以访问serviceConfig,但由于某种原因,我似乎已经抛出了所有UDF函数抛出空指针异常

serviceConfig被定义为类中的变量。 无论何时调用此函数,它都会在serviceConfig.getAdminKeySpace中引发空指针异常。看起来像serviceConfig是空的。但是,如果我在类中任何地方的UDF函数之外放置相同的语句,它似乎可行。在这个类被实例化之后,UDF函数被调用。 UDF函数是否无法访问serviceConfig或什么?包含这个方法的类扩展Serializable,所以我不知道这是否会有所作为。

+0

你能告诉你如何定义变量'serviceConfig'吗? – himanshuIIITian

+0

它看起来像一个范围问题。你能发布更多的代码吗? –

回答

0

其实这样的问题,原来是这样一句话:

var serviceConfig =configs.getServiceConfig 

CONFIGS是另一个Java类,必须配置Java对象和配置是不可序列,因此不会有火花引起的火花工作需要可串行性。