java - 如何从 Java 中的 Scala 包中导入单例对象?
问题描述
我正在尝试在我的 Java 程序中使用从包中导入的ARIMA 对象(Scala)。虽然编译成功,意味着在编译过程中识别了 ARIMA 类,但在运行时 ARIMA 对象出现NoClassDefFoundError。ARIMAModel 类在导入时没有问题,因为它是一个类。
有什么方法可以使用我的 Java 程序中的 Scala 对象?
这是 Scala 包中对象的源代码。
文件:.../com/cloudera/sparkts/models/ARIMA.scala
package com.cloudera.sparkts.models
object ARIMA {
def autoFit(ts: Vector, maxP: Int = 5, maxD: Int = 2, maxQ: Int = 5): ARIMAModel = {
...
}
}
class ARIMAModel(...) {
...
}
这是我的Java代码。
文件:src/main/java/SingleSeriesARIMA.java
import com.cloudera.sparkts.models.ARIMA;
import com.cloudera.sparkts.models.ARIMAModel;
public class SingleSeriesARIMA {
public static void main(String[] args) {
...
ARIMAModel arimaModel = ARIMA.autoFit(tsVector, 1, 0, 1);
...
}
}
这是错误。
Exception in thread "main" java.lang.NoClassDefFoundError: com/cloudera/sparkts/models/ARIMA
at SingleSeriesARIMA.main(SingleSeriesARIMA.java:43)
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:729)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: com.cloudera.sparkts.models.ARIMA
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
我正在使用 Scala 版本 2.11.8 和 Java 1.8
解决方案
您需要使用以下选项Arima
向 spark 集群提供具有对象的依赖项 ---jars
spark-submit --jars <path>/<to>/sparkts-0.4.1.jar --class SingleSeriesARIMA target/simple-project-1.0.jar
这将传递其他依赖项以及应用程序 jar 以在spark-runtime
.
ARIMA
从 java调用对象使用-
ARIMA$.MODULE$.autoFit(tsVector, 1, 0, 1);
推荐阅读
- android - 如何在 TableView 中打印数据库中的数据?
- r - 对公司级别数据中的重复公司标识符进行子集化
- laravel - 为现有用户添加数据 - Laravel
- android - BottomNavigationView 单击项目时禁用灰色框
- php - php 中的运算符在表格背景颜色方面存在问题
- visual-studio-code - 看不到如何在 VS Code 中禁用键入自动建议下拉菜单
- javascript - 替代使用多个标志来显示隐藏多个元素
- amazon-web-services - Amazon EMR 与 Amazon Redshift
- slack - 用于搜索外部数据源的 Slack 对话框
- javascript - 页面在浏览器中被杀死后如何运行任务?