Spark时间序列 - 如何并行化代码?

时间:2017-03-31 08:39:37

标签: performance apache-spark time-series

我有一个包含以下架构的数据集。

inputData.printSchema()
 |-- seriesKeys: string (nullable = true)
 |-- timestamp: long (nullable = true)
 |-- targetSeries: double (nullable = true)

使用sparkts库,我想以分布式方式生成大量时间序列的ARIMA预测。通常,我可以使用TimeSeriesRDD as described in this blog by Sandy Ryza来解决此问题。根据我的理解,TimeSeriesRDD要求所有系列具有相同的开始和结束日期,而不是我的数据集的情况。所以我需要编写一个可以处理这种情况的代码。

目前,我的代码编写方式是一切都在驱动程序上执行而不是分布在执行程序中:

val seriesKeys: Array[Row] = inputData.select("seriesKeys").distinct().collect()

  val forecastArray : Array[Array[Double]] = seriesKeys.map(key => {
  val inputDataTemp : Dataset[mySchema] = inputData.where(s"seriesKeys ='$key'")
  val dfTS : DataFrame = inputDataTemp.select("targetSeries")
  val rddTS : RDD[Double] = dfTS.rdd.map(row => row.getAs[Double]("targetSeries"))
  val dvTS: Vector = Vectors.dense(rddTS.collect())
  val dvForecast: Vector = ARIMA.autoFit(dvTS, 5, 2, 5).forecast(dvTS, 12)
  dvForecast.toArray
})

我如何重新设计代码以允许在oder中并行执行以提高性能?

1 个答案:

答案 0 :(得分:0)

这不是电话双关语,但不要拨打collect。您需要使用RDDDataset/DataFrame等分布式抽象进行操作。您现在的方式seriesKeys未分发,因为它是Array