我试图熟悉Scala(spark)中的类,并在XGBoostClassifier
上编写了一个简单的包装器类进行试验。包装器类准备就绪后,我尝试设置一些参数,但出现错误,无法在网上找到太多帮助
这是我正在使用的课程
class trialXGBClassifier{
var xgb_cls_object: XGBoostClassifier = _
}
我还写了一个小的实用程序函数,将JSON转换为Map
(字符串,字符串)
def jsonToMap(jsonString: String): Map[String, String] = {
val jsonMap = JSON.parseFull(jsonString).get.asInstanceOf[Map[String, String]]
return jsonMap
}
这是给我错误的代码
var params = """{"numRound": "10"}"""
var trial_xgb = new trialXGBClassifier
trial_xgb.xgb_cls_object.setSeed(jsonToMap(params)("numRound").toLong)
这是我收到的错误消息
java.lang.NullPointerException
... 61 elided
我尝试使用实际的ml.dmlc类进行以下操作,并且可以正常工作
var xgb_orig = new XGBoostClassifier
xgb_orig.setSeed(jsonToMap(params)("numRound").toLong)
xgb_orig.getSeed #10
此错误背后的原因是什么,我该如何解决?
[在Scala中,人们尝试在所有可能的地方使用val
而不是var
。此外,他们尝试使用case class
或sealed trait
而不只是class
。因此,有一种很好的方法可以避免使用case class
这样的问题:
case class TrialXGBClassifier(xgb_cls_object: XGBoostClassifier)
然后是最好的选择,只有在您要包装的东西时才使用包装器:
val xgb_orig = new XGBoostClassifier
xgb_orig.setSeed(jsonToMap(params)("numRound").toLong)
val v = TrialXGBClassifier(xgb_orig)
甚至您可以省略xgb_orig
声明:
val v = TrialXGBClassifier(new XGBoostClassifier)
v.xgb_cls_object.setSeed(jsonToMap(params)("numRound").toLong)