我使用Apache Spark版本1.2.1和Scala版本2.10.4.我想让示例MovieLensALS正常工作.但是,我遇到了scopt库的错误,这是代码中的一个要求.任何帮助,将不胜感激.我的build.sbt如下:
name := "Movie Recommender System"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1"
libraryDependencies += "org.apache.spark" %% "spark-graphx" % "1.2.1"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.10" % "1.2.1"
libraryDependencies += "com.github.scopt" %% "scopt" % "3.2.0"
resolvers += Resolver.sonatypeRepo("public")
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
Exception in thread "main" java.lang.NoClassDefFoundError: scopt/OptionParser
at MovieLensALS.main(MovieLensALS.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:358)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: scopt.OptionParser
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native …Run Code Online (Sandbox Code Playgroud) 我试图拥有一个带有一些默认参数的基本选项解析器。
在其他项目中,我想使用其他参数扩展选项解析器。
就像是:
case class Config(foo: String = null)
trait DefaultParser { self: OptionParser[Config] =>
opt[String]('f', "foo") action { (x, c) =>
c.copy(foo = x)
}
}
case class MyConfig(bar: String = "hello world")
trait MyParser { self: OptionParser[MyConfig] =>
opt[String]('b', "bar") action { (x, c) =>
c.copy(bar = x)
}
}
Run Code Online (Sandbox Code Playgroud)
我是新手Scala,我不确定现在如何在同一个args.
我正在使用Scala2.10 和scopt_2.10v3.3.0。
使用scopt https://github.com/scopt/scopt
我有一个非常简单的Scala CLI驱动程序,它在.parse的第一行出错.该行是var i = 0,无法想象为什么会失败,也许在我如何实例化OptionParser?
def parse(args: Seq[String], init: C): Option[C] = {
var i = 0 <———————————————— prints the error below
val pendingOptions = ListBuffer() ++ (nonArgs filterNot {_.hasParent})
Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.IntRef.create(I)Lscala/runtime/IntRef;
at scopt.OptionParser.parse(options.scala:306)
at org.apache.mahout.drivers.ItemSimilarityDriver$.main(ItemSimilarityDriver.scala:47)
at org.apache.mahout.drivers.ItemSimilarityDriver.main(ItemSimilarityDriver.scala)
Run Code Online (Sandbox Code Playgroud)
这里有完整的代码,很抱歉,但我是Scala的新手,所以这可能是一个非常愚蠢的问题
object ItemSimilarityDriver {
/**
* @param args Command line args, if empty a help message is printed.
* @return
*/
def main(args: Array[String]): Unit = {
val parser = new OptionParser[Config]("ItemSimilarity") {
head("ItemSimilarity", "Spark")
opt[Unit]('r', …Run Code Online (Sandbox Code Playgroud) 我想让一个案例类扩展一个特征
这是我的要求:
trait ParentParams { var name: String = "Al" }则子项不应为case class ChildParams(id: String = "whatever", override val name: String = Parent.defaultName) extends Parent。我宁愿将其作为case class Child(id: String) extends Parent。但是,当我尝试第二种方法时,当我尝试对.copy()case类对象进行操作时,我无法访问名称字段。作为一种解决方法,我可以通过以下方式更改name属性的值childObj.name = "newName" var而不是val。但是,理想情况下,我希望使其不可变,并使用copy方法更改值。这就是我现在拥有的,但是无法使用该.copy()方法来更改继承属性的值。
package abcd.wxyz
import org.scalatest.{FlatSpec, Matchers}
trait ParentTrait {
var name: String = "name"
}
case class TestParams(param1: String = "123") extends ParentTrait
class TestParamsSpec extends FlatSpec with Matchers …Run Code Online (Sandbox Code Playgroud) 我有一个基本的Config案例类,它被用作几个不同脚本的Configs的通用部分.我希望能够为解析此基本配置的OptionParsers停止复制粘贴代码(例如,每个脚本都需要--cluster,--port因此我希望单个基础OptionParser始终处理这个问题),并让最小的自定义OptionParser处理每个脚本独有的选项(例如--asdf).
问题是,如果我要求基本解析器解析包含的参数--asdf,Scopt抱怨:
[error] Error: Unknown option --asdf
[error] Usage: Config [options]
[error]
[error] -c <value> | --cluster <value>
[error] Cluster the machine is part of
[error] -p <value> | --port <value>
[error] Port to listen on
...
[error] Exception in thread "main" java.util.NoSuchElementException: None.get
Run Code Online (Sandbox Code Playgroud)
有没有办法让它忽略未知的参数?