【问题标题】:Adding value to column if certain condition meets per group in spark如果某些条件满足 spark 中的每个组,则向列添加值
【发布时间】:2020-10-31 11:41:57
【问题描述】:

我猜我有一些相当简单的东西。

我试图实现的是每组,如果满足特定条件,则给出增加的数字(等级?)。对于每个组,它从 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 上搜索了“条件窗口函数”、“滞后、领先......),但没有任何效果,或者我没有找到重复的问题。

【问题讨论】:

    标签: apache-spark pyspark group-by window-functions


    【解决方案1】:

    要获取列 what_i_want,您可以在 to_add_number 上运行 incremental sum 并使用 orderby 列( 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|
    #+------+-------------+-----------+
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多