2017-03-10 271 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對象和配置是不可序列,因此不會有火花引起的火花工作需要可串行性。