異なる時間ステップで累積カウントを計算したい。私は各期間に発生したイベントの数を持っていますt
:今度はその期間までの累積イベント数を欲しがります。ハードコーディングのないt期間の累積カウントを計算する
私はそれぞれの累積を別々に簡単に計算できますが、面倒です。私はUnionAll
と一緒に戻すことができますが、これは時間がかかりすぎて面倒です。
これをもっときれいに行うことができますか?
package main.scala
import java.io.File
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.functions._
object Test {
def main(args: Array[String]) {
// Spark and SQL Context (gives access to Spark and Spark SQL libraries)
val conf = new SparkConf().setAppName("Merger")
val sc = new SparkContext(conf)
val sqlContext = SQLContextSingleton.getInstance(sc)
import sqlContext.implicits._
// Count
val count = Seq(("A",1,1),("A",1,2),("A",0,3),("A",0,4),("A",0,5),("A",1,6),
("B",1,1),("B",0,2),("B",0,3),("B",1,4),("B",0,5),("B",1,6))
.toDF("id","count","t")
val count2 = count.filter('t <= 2).groupBy('id).agg(sum("count"), max("t"))
val count3 = count.filter('t <= 3).groupBy('id).agg(sum("count"), max("t"))
count.show()
count2.show()
count3.show()
}
}
count
:
+---+-----+---+
| id|count| t|
+---+-----+---+
| A| 1| 1|
| A| 1| 2|
| A| 0| 3|
| A| 0| 4|
| A| 0| 5|
| A| 1| 6|
| B| 1| 1|
| B| 0| 2|
| B| 0| 3|
| B| 1| 4|
| B| 0| 5|
| B| 1| 6|
+---+-----+---+
count2
:
+---+----------+------+
| id|sum(count)|max(t)|
+---+----------+------+
| A| 2| 2|
| B| 1| 2|
+---+----------+------+
count3
:
+---+----------+------+
| id|sum(count)|max(t)|
+---+----------+------+
| A| 2| 3|
| B| 1| 3|
+---+----------+------+