Dataframe 带条件的Pypark累积和

Dataframe 带条件的Pypark累积和,dataframe,pyspark,apache-spark-sql,cumulative-sum,Dataframe,Pyspark,Apache Spark Sql,Cumulative Sum,我有一个包含3列的pyspark数据帧: ID,每个ID出现多次; 日期; 延迟,如果此账单按时支付,则为0,否则为1 已经按ID和日期订购了。 我需要创建一个名为Continuous的列,该列显示连续支付的账单数量,每个ID的延迟=1 数据示例和预期结果: ID | DATE | DELAY | CONSECUTIVE 101 | 1 | 1 | 1 101 | 2 | 1 | 2 101 | 3 | 1 | 3 10

我有一个包含3列的pyspark数据帧:

ID,每个ID出现多次; 日期; 延迟,如果此账单按时支付,则为0,否则为1

已经按ID和日期订购了。 我需要创建一个名为Continuous的列,该列显示连续支付的账单数量,每个ID的延迟=1

数据示例和预期结果:

ID    | DATE  | DELAY  | CONSECUTIVE
101   | 1     | 1      | 1
101   | 2     | 1      | 2
101   | 3     | 1      | 3
101   | 4     | 0      | 0
101   | 5     | 1      | 1
101   | 6     | 1      | 2
213   | 1     | 1      | 1
213   | 2     | 1      | 2

有没有一种不用熊猫的方法?如果是这样的话,我该怎么做呢?

您可以在window的帮助下通过3个转换来实现这一点

from pyspark.sql.window import Window
from pyspark.sql import functions as F

df = sqlContext.createDataFrame([
    (101, 1, 1),
    (101, 2, 1), # dasd
    (101, 3, 0),
    (101, 4, 1)
], ["id", 'date', 'delay'])

window = Window.partitionBy('id').orderBy('date')
last_value = F.last('rank').over(window.rowsBetween(-2, -1))
consecutive = F.when( F.col('delay')==0, 0) \
            .otherwise( F.when(F.col('last_rank').isNull(), 1) \
            .otherwise( F.col('last_rank')+1))

df \
    .withColumn('rank', F.row_number().over(window)) \
    .withColumn('rank', F.when(F.col('delay')!=0, F.col('rank')).otherwise(0)) \
    .withColumn('last_rank', last_value) \
    .withColumn('consecutive', consecutive).show()
结果:

+---+----+-----+----+---------+-----------+
| id|date|delay|rank|last_rank|consecutive|
+---+----+-----+----+---------+-----------+
|101|   1|    1|   1|     null|          1|
|101|   1|    1|   2|        1|          2|
|101|   1|    0|   0|        2|          0|
|101|   1|    1|   4|        0|          1|
+---+----+-----+----+---------+-----------+

可能的重复请参见重复目标-您正在查找类似
df.withColumn('continued',F.sum('DELAY')。over(Window.partitionBy('ID'))。orderBy('DATE')。rangeBetween(Window.unboundedPreceding,0))