spark之移动平均(内存中排序)
关于移动平均的详细解释,可以参考MapReduce之移动平均,这里只是把程序从MapReduce换成了spark-scala,原理上没变化,不过scala写起来确实比MapReduce快
package MoveAverage
import org.apache.spark.{SparkConf, SparkContext}
object MovingAverageInMemory {
def main(args: Array[String]): Unit ={
val conf=new SparkConf().setAppName("MovinfAverageInMemory").setMaster("local")
val sc=new SparkContext(conf)
val window=2 //根据情况需要随便定
val input="input/MovingAverage.txt"
val output="output"
val broadcastWindow=sc.broadcast(window)
val rawData=sc.textFile(input)
val keyValue=rawData.map(line=>{
val tokens=line.split(",")
(tokens(0),(tokens(1),tokens(2).toDouble))
})
//数据按键进行分组操作
val groupByStockSymbol=keyValue.groupByKey()
//原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素
val result=groupByStockSymbol.mapValues(values=>{
val dateFormat=new java.text.SimpleDateFormat("yyyy-MM-dd")
val sortedValues=values.map(s=>(dateFormat.parse(s._1).
getTime.toLong,s._2)).toSeq.sortBy(_._1)
val queue=new scala.collection.mutable.Queue[Double]()
for (tup <- sortedValues) yield {
queue.enqueue(tup._2)
if (queue.size > broadcastWindow.value)
queue.dequeue
(dateFormat.format(new java.util.Date(tup._1)), (queue.sum / queue.size))
}
})
val formattedResult=result.flatMap(kv=>{
kv._2.map(v=>(kv._1+","+v._1+","+v._2.toString))
})
formattedResult.saveAsTextFile(output)
sc.stop()
}
}
至于使用使用分区程序进行排序的方法目前还没搞懂,日后补上