Pyspark-添加一列来计算累积的先前连续值

时间:2019-12-13 15:18:21

标签: apache-spark pyspark pyspark-sql pyspark-dataframes

问题在标题中,但是您如何在Pyspark中创建一个新列,该列累计先前重复值的数量?

例如:

|  Value
|  0
|  0
|  5
|  5
|  -1
|  0
|  0
|  0

将其应用于value列将产生新的值列

| Value | Result
|  0    |  1
|  0    |  2
|  5    |  1
|  5    |  2
|  -1   |  1
|  0    |  1
|  0    |  2
|  0    |  3

1 个答案:

答案 0 :(得分:0)

一种解决方案是利用行号之间的差异来创建组。

group = (row_number order by "ID") - (row_number partition by "Value", order by "ID")

然后使用组列来计算row_number()作为结果。

这里是一个例子:

data = [(0, 0), (1, 0), (2, 5), (3, 5),
        (4, -1), (5, 0), (6, 0), (7, 0)
        ]

df = spark.createDataFrame(data, ["ID", "Value"])

df.withColumn("grp",
              row_number().over(Window.orderBy(col("ID")))
              - row_number().over(Window.partitionBy("Value").orderBy(col("Id")))
              ) \
    .withColumn("Result", row_number().over(Window.partitionBy("grp").orderBy(col("ID")))) \
    .drop("grp")\
    .show()

+---+-----+------+
| ID|Value|Result|
+---+-----+------+
|  0|    0|     1|
|  1|    0|     2|
|  2|    5|     1|
|  3|    5|     2|
|  5|    0|     1|
|  6|    0|     2|
|  7|    0|     3|
|  4|   -1|     1|
+---+-----+------+