apache-spark - 如果某些条件满足 spark 中的每个组,则向列添加值
问题描述
我猜我有一些相当简单的东西。
我试图实现的是每组,如果满足某个条件,则给出一个增加的数字(等级?)。对于每个组,它从 1 开始,如果满足条件,则下一行是上一行的值 +1。这样在组内越走越远,每次满足条件,加1。
下表可能会更清楚地显示它。(我尝试创建的是列“what_i_want”)
group to_add_number what_i_want
aaaaaa 0 1
aaaaaa 0 1
aaaaaa 1 2
aaaaaa 0 2
aaaaaa 0 2
aaaaaa 1 3
aaaaaa 0 3
aaaaaa 0 3
bbbbbb 0 1
bbbbbb 1 2
bbbbbb 1 3
bbbbbb 0 3
cccccc 0 1
cccccc 0 1
cccccc 0 1
cccccc 1 2
我认为窗口函数(滞后)可能会做到这一点,但我无法到达那里。
我尝试的是:
from pyspark.sql.functions import lit,when,lag,row_number
from pyspark.sql.window import Window
windowSpec=Window.partitionBy('group')
df=df.withColumn('tmp_rnk',lit(1))
df=df.withColumn('what_i_want',when(col('to_add_number')==0,lag('tmp_rnk').over(windowSpec)).otherwise(col('what_i_want')+1)
or
df=df.withColumn('tmp_rnk',lit(1))
df=df.withColumn('row_number_rank',row_number().over(windowSpec))
df=df.withColumn('what_i_want',when((col('to_add_number')==0)&(col('row_number_rank')==1)
,lit(1)
.when(col('to_add_number')==0)&(col('row_number_rank')>1),lag('what_i_want').over(windowSpec).otherwise(col('what_i_want')+1)
我尝试了几种变体,在 stackoverflow 上搜索了“条件窗口函数”、“滞后、领先......),但没有任何效果,或者我没有找到重复的问题。
解决方案
要获取 column ,您可以使用 orderby 列 ( )what_i_want
运行incremental sum
on 。to_add_number
order_id
from pyspark.sql import functions as F
from pyspark.sql.window import Window
df.withColumn("order_id", F.monotonically_increasing_id())\
.withColumn("what_i_want", F.sum("to_add_number").over(Window().partitionBy("group").orderBy("order_id"))+1)\
.orderBy("order_id").drop("order_id").show()
#+------+-------------+-----------+
#| group|to_add_number|what_i_want|
#+------+-------------+-----------+
#|aaaaaa| 0| 1|
#|aaaaaa| 0| 1|
#|aaaaaa| 1| 2|
#|aaaaaa| 0| 2|
#|aaaaaa| 0| 2|
#|aaaaaa| 1| 3|
#|aaaaaa| 0| 3|
#|aaaaaa| 0| 3|
#|bbbbbb| 0| 1|
#|bbbbbb| 1| 2|
#|bbbbbb| 1| 3|
#|bbbbbb| 0| 3|
#|cccccc| 0| 1|
#|cccccc| 0| 1|
#|cccccc| 0| 1|
#|cccccc| 1| 2|
#+------+-------------+-----------+
推荐阅读
- sql - Hive sql找出每个国家有多少共同客户
- php - Laravel 合并数组
- javascript - 最大长度参数的排列
- javascript - 我有 2 个类在页面上创建元素并显示它的问题
- javascript - 更新 Firestore 文档时可以动态更改键和值吗?
- django - 在 Elastic Beanstalk 上运行集中式服务
- css - 在横向模式下在移动视图中显示/隐藏 div
- javascript - Swiper,无法使图库拇指移动如何解决?
- r - 如何使用 tidyverse 去除基于标准开发的异常值?
- laravel - 使用 laravel 修改 vuetify 主题