Настройка параметров в классах scala - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь познакомиться с классами в 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.dml c, и он работает

var xgb_orig = new XGBoostClassifier
xgb_orig.setSeed(jsonToMap(params)("numRound").toLong)
xgb_orig.getSeed #10

В чем причина этой ошибки и как мне это сделать исправить это?

1 Ответ

1 голос
/ 06 января 2020

В 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)
...