首页 > 解决方案 > 如何从 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

标签: javascalaapache-spark

解决方案


您需要使用以下选项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);

推荐阅读