Spark:重新开始计算特定值
Spark: restart counting on specific value
我有一个带有布尔记录的数据框,我想在 goal=False/Null.
时重新开始计数
我怎样才能得到分数标签?
分数选项卡是对 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
我创建了一个 window 来计算玩家在特定日期的得分
val w = Window.partitionBy("Player","Goals").orderBy("date")
我已经尝试使用滞后函数并比较值,但我无法重置计数。
EDIT2:为每个玩家添加唯一的日期
谢谢。
我终于解决了将一起出现的目标分组的问题。
我对分区进行了计数,其中包含 "table" 的行索引与与分区 window 相关的 row_number 的行索引之间的差异。
首先声明 window 以及将来要使用的列
val w = Window.partitionBy("player","goals","countPartition").orderBy("date")
然后用 1 填充列 "countPartition" 和 "goals" 以保持行号中性
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")
我有一个带有布尔记录的数据框,我想在 goal=False/Null.
时重新开始计数我怎样才能得到分数标签? 分数选项卡是对 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
我创建了一个 window 来计算玩家在特定日期的得分
val w = Window.partitionBy("Player","Goals").orderBy("date")
我已经尝试使用滞后函数并比较值,但我无法重置计数。
EDIT2:为每个玩家添加唯一的日期
谢谢。
我终于解决了将一起出现的目标分组的问题。
我对分区进行了计数,其中包含 "table" 的行索引与与分区 window 相关的 row_number 的行索引之间的差异。
首先声明 window 以及将来要使用的列
val w = Window.partitionBy("player","goals","countPartition").orderBy("date")
然后用 1 填充列 "countPartition" 和 "goals" 以保持行号中性
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")