Apache Spark:将时间序列数据从每天一行转换为24 X 1小时行

时间:2016-04-28 03:54:31

标签: scala dictionary apache-spark

我将数据汇总1行,持续1天。我想将数据拆分为24 X 1 hr数据。

 context.font = font;

1 个答案:

答案 0 :(得分:2)

假设时间序列在(日,值)对中:

java.lang.RuntimeException: Unable to start activity ComponentInfo{lux.unisabana.sabanaviveenti/sabanaviveenti.unisabana.lux.unisabana.appsabana.MainActivity}: java.lang.IllegalArgumentException: AppIndex: The android-app URI host must match the package name and follow the format android-app://<package_name>/<scheme>/[host_path]. Provided URI: android-app://sabanaviveenti.unisabana.lux.unisabana.appsabana/http/host/path

并且您希望将它们转换为(小时,值)对,其中当天所有货币对的值保持不变。

(1,10)
(2,5)
(3,4)
...

以下是在基本Scala中执行此操作的方法:

(1,10)
(2,10)
(3,10)
...
(24,10)
(25,5)
...
(48,5)
(49,4)
...
(72,4)
...

以下是如何在Spark上执行此操作:

val timeSeries = Seq(1->10, 2->5, 3->4)

timeSeries.flatMap{ case(day,value) => 
   ((1 to 24)).map( h => ( (h+(day-1)*24),value)) 
}

Spark的一个复杂因素是数据可能会出现故障,这可能会破坏您的时间序列中的顺序。为了解决这个问题,最简单的方法是在RDD上调用操作之前对数据进行排序。

val rddTimeSeries = sc.makeRDD(timeSeries)

// Very similar with what we do in Scala
val perHourTs = rddTimeSeries.flatMap{ case(day,value) => 
   ((1 to 24)).map( hour => ( (hour + (day-1)*24 ), value)) 
}
// We can print it given that we know the list is small
println(perHourTs.collect().toList)