英文:
Setting parameters in scala classes
问题
我正在尝试熟悉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
这个错误的原因是什么,我该如何解决?
英文:
I am trying to get familiar with classes in Scala(spark) and I wrote a simple wrapper class over XGBoostClassifier
to experiment with. Once that wrapper class was ready, I tried setting some parameters but I am getting errors and can't find much help online
This is the class I am using
class trialXGBClassifier{
var xgb_cls_object: XGBoostClassifier = _
}
I also wrote a small utility function to convert JSON to a Map
(string, string)
def jsonToMap(jsonString: String): Map[String, String] = {
val jsonMap = JSON.parseFull(jsonString).get.asInstanceOf[Map[String, String]]
return jsonMap
}
And this is the code that's giving me the error
var params = """{"numRound": "10"}"""
var trial_xgb = new trialXGBClassifier
trial_xgb.xgb_cls_object.setSeed(jsonToMap(params)("numRound").toLong)
This is the error message I get
java.lang.NullPointerException
... 61 elided
I tried doing the following using the actual ml.dmlc class and it works
var xgb_orig = new XGBoostClassifier
xgb_orig.setSeed(jsonToMap(params)("numRound").toLong)
xgb_orig.getSeed #10
Whats the reason behind this error and how do I fix this?
答案1
得分: 1
在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)
英文:
In Scala, people try to use val
instead of var
in all places where such usage possible. Also, they try to use case class
or sealed trait
instead of just class
.
So, there's a very nice way to avoid such kind of issues using case class
:
case class TrialXGBClassifier(xgb_cls_object: XGBoostClassifier)
And then the best option to use your wrapper only when you have something to wrap:
val xgb_orig = new XGBoostClassifier
xgb_orig.setSeed(jsonToMap(params)("numRound").toLong)
val v = TrialXGBClassifier(xgb_orig)
And you even can omit xgb_orig
declaration:
val v = TrialXGBClassifier(new XGBoostClassifier)
v.xgb_cls_object.setSeed(jsonToMap(params)("numRound").toLong)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论