我有一个包含以下架构的数据集。
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中并行执行以提高性能?
答案 0 :(得分:0)
这不是电话双关语,但不要拨打collect
。您需要使用RDD
和Dataset/DataFrame
等分布式抽象进行操作。您现在的方式seriesKeys
未分发,因为它是Array
。