scala类中的设置参数

问题描述 投票:-1回答:1

我试图熟悉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 apache-spark xgboost
1个回答
0
投票

[在Scala中,人们尝试在所有可能的地方使用val而不是var。此外,他们尝试使用case classsealed 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)
© www.soinside.com 2019 - 2024. All rights reserved.