我注意到一個奇怪的行爲,而使用Spark的項目使用Scala 2.10,我正在閱讀一個屬性文件,並寫入一個地圖(loadConfig)內的所有內容,我也創建了一個簡單方法,該方法返回給定鍵的值。Scala類懶惰val變量奇怪的行爲與火花
問題是,當我得到的所有的lazy val
類變量列入黑名單的名字時,namesBlackList
顯示爲空東陽我所有的Person
已經「完全訪問」標籤,至極是不正確的
然而,當我寫namesBlackList
裏面filterAccess
然後一切工作完好。
ConfigManager.scala
object ConfigManager extends Serializable {
private var configMap = Map.empty[String, String]
def loadConfig(configPath:String) = {
// Reads a key/value properties file and writes it in the configmap
}
def getParameter(parameter: String): String = configMap.getOrElse(parameter, s"${parameter}=>UNKNOWN")
}
AnalyseData.scala
object AnalyseData extends Serializable {
private lazy val namesBlackList = ConfigManager.getParameter("names.blacklist").toSet
def filterAccess(rdd:RDD[Person]) : RDD[Person] = {
rdd.map {person =>
if (namesBlackList.contains(person.firstName))
(person.firstName,person.lastName,"limited access")
else
(person.firstName,person.lastName,"full Access")
}
}
}
AnalyseService.scala
object AnalyseService extends Serializable {
def main(path:String) {
ConfigManager.loadConfig(path)
val datas = createNameRdd // reads from a db and create a RDD[Person]
val filteredData = AnalyseData.filterAccess(datas)
}
}
我試圖調整我的代碼中的所有內容,看起來,由於Spark以lazy
的方式執行map
方法,因此將Singleton對象的結果設置爲lazy val
類變量將不會產生正確的結果。 我不明白爲什麼它不工作,更重要的是,我真的找不到如何解決這個問題,除了在方法內調用namesBlackList
感謝您的意見。
似乎就像ConfigManager在'namesBlackList'值初始化時還沒有準備好。你知道它什麼時候被初始化了嗎?你能否展示'excludeNames'方法的主體,即它的工作原理? –
我在寫我的文章時犯了一個錯誤,excludeNames實際上是filterAccess,請參閱我編輯的文章。 – Will