Spark:重新开始计算特定值

时间:2017-11-20 09:44:31

标签: scala apache-spark spark-dataframe rdd

我有一个带有布尔记录的dataFrame,我希望在goal = False / Null时重新开始计数。

我如何获得分数标签? 分数选项卡是True值的计数,其中False / null值重置

我的df:

Goals
Null 
True
False 
True
True
True
True
False 
False 
True
True

预期结果:

Goals   Score
Null    0
True    1
False   0
True    1
True    2
True    3
True    4
False   0
False   0
True    1
True    2

编辑:添加更多信息

实际上我的完整数据集是:

Player   Goals         Date         Score
1       Null    2017-08-18 10:30:00 0
1       True    2017-08-18 11:30:00 1
1       False   2017-08-18 12:30:00 0
1       True    2017-08-18 13:30:00 1
1       True    2017-08-18 14:30:00 2
1       True    2017-08-18 15:30:00 3
1       True    2017-08-18 16:30:00 4
1       False   2017-08-18 17:30:00 0
1       False   2017-08-18 18:30:00 0
1       True    2017-08-18 19:30:00 1
1       True    2017-08-18 20:30:00 2
2       False   2017-08-18 10:30:00 0
2       False   2017-08-18 11:30:00 0
2       True    2017-08-18 12:30:00 1
2       True    2017-08-18 13:30:00 2
2       False   2017-08-18 15:30:00 0

我创建了一个窗口来计算玩家在特定日期的分数

   val w = Window.partitionBy("Player","Goals").orderBy("date")

我已尝试使用滞后功能并比较值,但我无法重置计数。

EDIT2:为每位玩家添加唯一日期

谢谢。

1 个答案:

答案 0 :(得分:0)

我终于解决了将一起发生的目标分组的问题。

我在分区上使用了一个计数,其中包含"表"的行索引之间的差异。和row_number与分区窗口有关。

首先使用将来的列声明窗口

val w = Window.partitionBy("player","goals","countPartition").orderBy("date")

然后填充列" countPartition"和"目标"用1来保持rowNumber中性

  val list1=  dataList.withColumn("countPartition", lit(1)).withColumn("goals", lit(1)).withColumn("index", rowNumber over w )

udf

def div = udf((countInit: Int, countP: Int) => countInit-countP)

最后计算得分

  val score = list1.withColumn("goals", goals).withColumn("countPartition", div(col("index") , rowNumber over w )).withColumn("Score", when(col("goals") === true, count("goals") over w ).otherwise(when(col("goals") isNull, "null").otherwise(0))).orderBy("date")