2016-10-13 4 views
-1

자바를 사용하여 ARIMA 시계열을 구현하고 싶습니다. 내가 솔루션 다음 시도Spark ClassCastException : JavaRDD를 org.apache.spark.mllib.linalg.Vector로 캐스팅 할 수 없습니다.

object SingleSeriesARIMA { 
    def main(args: Array[String]): Unit = { 
    // The dataset is sampled from an ARIMA(1, 0, 1) model generated in R. 
    val lines = scala.io.Source.fromFile("../data/R_ARIMA_DataSet1.csv").getLines() 
    val ts = Vectors.dense(lines.map(_.toDouble).toArray) 
    val arimaModel = ARIMA.fitModel(1, 0, 1, ts) 
    println("coefficients: " + arimaModel.coefficients.mkString(",")) 
    val forecast = arimaModel.forecast(ts, 20) 
    println("forecast of next 20 observations: " + forecast.toArray.mkString(",")) 
    } 
} 

: 내가 스칼라 코드 다음 한

public class JavaARIMA { 

public static void main(String args[]) 
     { 
    System.setProperty("hadoop.home.dir", "C:/winutils"); 
    SparkConf conf = new SparkConf().setAppName("Spark-TS Ticker Example").setMaster("local").set("spark.sql.warehouse.dir", "file:///C:/Users/devanshi/Downloads/Spark/sparkdemo/spark-warehouse/"); 
    JavaSparkContext context = new JavaSparkContext(conf); 

    JavaRDD<String> lines = context.textFile("path/inputfile"); 

    JavaRDD<Vector> ts = lines.map(
       new Function<String, Vector>() { 
       public Vector call(String s) { 
        String[] sarray = s.split(","); 
        double[] values = new double[sarray.length]; 
        for (int i = 0; i < sarray.length; i++) { 
        values[i] = Double.parseDouble(sarray[i]); 
        } 
        return Vectors.dense(values); 
       } 
       } 
      ); 
    double[] total = {1.0,0.0,1.0}; 
    //DenseVector dv = new DenseVector(total); 
    //convert(dv,toBreeze()); 
    //ARIMAModel arimaModel = ARIMA.fitModel(1, 0, 1, dv, true, "css-cgd", null); 
    ARIMAModel arimaModel = ARIMA.fitModel(1, 0, 1, (Vector) ts, false, "css-cgd", total); 

    // arimaModel = ARIMA.fitModel(1, 0, 1, ts); 
    System.out.println("coefficients: " + arimaModel.coefficients()); 
    Vector forcst = arimaModel.forecast((Vector) ts,20); 
    System.out.println("forecast of next 20 observations: " + forcst); 
} 
} 

하지만 내가 가지고 : 가능하면

Exception in thread "main" java.lang.ClassCastException: 
org.apache.spark.api.java.JavaRDD cannot be cast to 
org.apache.spark.mllib.linalg.Vector 

저를 도와주세요.

답변

0

JavaRDD를 Vector에 캐스트 할 수 없으므로 rdd.foreach를 사용하여 개별 Vector를 가져와야합니다. 따라서 코드는 이와 같을 수 있습니다. 이 도움이

ts.foreach(new VoidFunction<Vector>() { 
    @Override 
    public void call(Vector v) throws Exception { 
     double[] total = { 1.0, 0.0, 1.0 }; 
     ARIMAModel arimaModel = ARIMA.fitModel(1, 0, 1, (Vector) v, false, "css-cgd", total); 

     System.out.println("coefficients: " + arimaModel.coefficients()); 
     Vector forcst = arimaModel.forecast((Vector) v, 20); 
     System.out.println("forecast of next 20 observations: " + forcst); 
    } 
}); 

희망 ...

+0

이 주셔서 감사합니다 .. –

관련 문제