2016-10-14 48 views
1

我試圖在星火外殼以更新策略變量參數「categoricalFeaturesInfo」象下面這樣:如何更新樹模型的策略參數星火MlLib

import org.apache.spark.mllib.tree.configuration.Strategy  
val treeStrategy = Strategy.defaultStrategy("Classification") 
val categoricalFeaturesInfo = Map[Int, Int]((0,4), (1,4)) 

treeStrategy.setCategoricalFeaturesInfo(categoricalFeaturesInfo) 

而且我得到了錯誤信息:

java.lang.NoSuchMethodError: org.apache.spark.mllib.tree.configuration.Strategy.setCategoricalFeaturesInfo(Lscala/collection/immutable/Map;)V 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:34) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:39) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:41) 
     at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:43) 
     at $iwC$$iwC$$iwC$$iwC.<init>(<console>:45) 
     at $iwC$$iwC$$iwC.<init>(<console>:47) 
     at $iwC$$iwC.<init>(<console>:49) 
     at $iwC.<init>(<console>:51) 
     at <init>(<console>:53) 
     at .<init>(<console>:57) 
     at .<clinit>(<console>) 
     at .<init>(<console>:7) 
     at .<clinit>(<console>) 
     at $print(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065) 
     at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1346) 
     at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902) 
     at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:814) 
     at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:657) 
     at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:665) 
     at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:670) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:997) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945) 
     at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135) 
     at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:945) 
     at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1059) 
     at org.apache.spark.repl.Main$.main(Main.scala:31) 
     at org.apache.spark.repl.Main.main(Main.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:752) 
     at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 
     at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

根據火花1.6.1(火花版本我有)的scala編程指南http://spark.apache.org/docs/1.6.1/api/scala/#org.apache.spark.mllib.tree.configuration.Strategy,我應該能夠使用給定的函數更新參數值。有沒有人對此有任何線索?謝謝!

回答

1

您需要一個java地圖不是斯卡拉地圖

根據下面的函數:

/** 
    * Sets categoricalFeaturesInfo using a Java Map. 
    */ 
    @Since("1.2.0") 
    def setCategoricalFeaturesInfo(
     categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]): Unit = { 
    this.categoricalFeaturesInfo = 
     categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap 
    } 

the code source