使用Spark重新格式化/转换时间序列数据的有效方法

时间:2016-12-13 06:16:54

标签: scala apache-spark time-series spark-dataframe

我想用spark构建一些时间序列模型。第一步是将序列数据重新格式化为训练样本。这个想法是:

原始顺序数据(每个t *是一个数字)

t1  t2  t3  t4  t5  t6  t7  t8  t9  t10

期望的输出

t1  t2  t3  t4  t5  t6
t2  t3  t4  t5  t6  t7
t3  t4  t5  t6  t7  t8
..................

如何在spark中编写一个函数来执行此操作。 函数签名应该像

reformat(Array [Integer],n:Integer)

返回类型是Dataframe或Vector

==========我在Spark 1.6.1上试过的代码=========

val arraydata=Array[Double](1,2,3,4,5,6,7,8,9,10)
val slideddata = arraydata.sliding(4).toSeq
val rows = arraydata.sliding(4).map{x=>Row(x:_*)}
sc.parallelize(arraydata.sliding(4).toSeq).toDF("Values")

最后一行无法通过错误:

Error:(52, 48) value toDF is not a member of org.apache.spark.rdd.RDD[Array[Double]]
    sc.parallelize(arraydata.sliding(4).toSeq).toDF("Values")

1 个答案:

答案 0 :(得分:1)

我无法弄清楚def reformat(arrayOfInteger:Array[Int], shiftValue: Int) ={ sc.parallelize(arrayOfInteger.sliding(shiftValue).toSeq).toDF("values") } 的重要性,因为它可以用作窗口大小以及它必须移动的值。

因此有两种口味:

如果n是窗口大小:

On REPL:

scala> def reformat(arrayOfInteger:Array[Int], shiftValue: Int) ={ | sc.parallelize(arrayOfInteger.sliding(shiftValue).toSeq).toDF("values") | } reformat: (arrayOfInteger: Array[Int], shiftValue: Int)org.apache.spark.sql.DataFrame scala> val arrayofInteger=(1 to 10).toArray arrayofInteger: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> reformat(arrayofInteger,3).show +----------+ | values| +----------+ | [1, 2, 3]| | [2, 3, 4]| | [3, 4, 5]| | [4, 5, 6]| | [5, 6, 7]| | [6, 7, 8]| | [7, 8, 9]| |[8, 9, 10]| +----------+

def reformat(arrayOfInteger:Array[Int], shiftValue: Int) ={
val slidingValue=arrayOfInteger.size-shiftValue
sc.parallelize(arrayOfInteger.sliding(slidingValue).toSeq).toDF("values")
}

如果n是要移位的值:

On REPL:

scala> def reformat(arrayOfInteger:Array[Int], shiftValue: Int) ={ | val slidingValue=arrayOfInteger.size-shiftValue | sc.parallelize(arrayOfInteger.sliding(slidingValue).toSeq).toDF("values") | } reformat: (arrayOfInteger: Array[Int], shiftValue: Int)org.apache.spark.sql.DataFrame scala> val arrayofInteger=(1 to 10).toArray arrayofInteger: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> reformat(arrayofInteger,3).show(false) +----------------------+ |values | +----------------------+ |[1, 2, 3, 4, 5, 6, 7] | |[2, 3, 4, 5, 6, 7, 8] | |[3, 4, 5, 6, 7, 8, 9] | |[4, 5, 6, 7, 8, 9, 10]| +----------------------+

Windows Server 2008 R2