枚举Spark中连续相等的值块

时间:2018-02-09 20:32:25

标签: apache-spark dataframe pyspark

我想在Spark DataFrame中找到trues的组(或块)的ID。也就是说,我想从此开始:

>>> df.show()
+---------+-----+
|timestamp| bool|
+---------+-----+
|        1|false|
|        2| true|
|        3| true|
|        4|false|
|        5| true|
|        6| true|
|        7| true|
|        8| true|
|        9|false|
|       10|false|
|       11|false|
|       12|false|
|       13|false|
|       14| true|
|       15| true|
|       16| true|
+---------+-----+

到此:

>>> df.show()
+---------+-----+-----+
|timestamp| bool|block|
+---------+-----+-----+
|        1|false|    0|
|        2| true|    1|
|        3| true|    1|
|        4|false|    0|
|        5| true|    2|
|        6| true|    2|
|        7| true|    2|
|        8| true|    2|
|        9|false|    0|
|       10|false|    0|
|       11|false|    0|
|       12|false|    0|
|       13|false|    0|
|       14| true|    3|
|       15| true|    3|
|       16| true|    3|
+---------+-----+-----+

(零是可选的,可以是Null或-1或更容易实现的任何东西)

1 个答案:

答案 0 :(得分:1)

我在scala中有一个解决方案,应该很容易适应pyspark。请考虑以下数据框df

+---------+-----+
|timestamp| bool|
+---------+-----+
|        1|false|
|        2| true|
|        3| true|
|        4|false|
|        5| true|
|        6| true|
|        7| true|
|        8| true|
|        9|false|
|       10|false|
|       11|false|
|       12|false|
|       13|false|
|       14| true|
|       15| true|
|       16| true|
+---------+-----+

然后你可以这样做:

df
  .withColumn("prev_bool",lag($"bool",1).over(Window.orderBy($"timestamp")))
  .withColumn("block",sum(when(!$"prev_bool" and $"bool",1).otherwise(0)).over(Window.orderBy($"timestamp")))
  .drop($"prev_bool")
  .withColumn("block",when($"bool",$"block").otherwise(0))
  .show()


+---------+-----+-----+
|timestamp| bool|block|
+---------+-----+-----+
|        1|false|    0|
|        2| true|    1|
|        3| true|    1|
|        4|false|    0|
|        5| true|    2|
|        6| true|    2|
|        7| true|    2|
|        8| true|    2|
|        9|false|    0|
|       10|false|    0|
|       11|false|    0|
|       12|false|    0|
|       13|false|    0|
|       14| true|    3|
|       15| true|    3|
|       16| true|    3|
+---------+-----+-----+