Python PySpark SQL数据帧以增量方式标识和存储连续的匹配值行
我想知道是否可以将pyspark数据框中布尔列的信息存储到另一列中,该列显示连续真值的“出现次数” 我有一个专栏 我要创建的列 真的 1. 真的 1. 真的 1. 真的 1. 假的 0 假的 0 真的 2. 真的 2. 假的 0 真的 3. 真的 3.Python PySpark SQL数据帧以增量方式标识和存储连续的匹配值行,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我想知道是否可以将pyspark数据框中布尔列的信息存储到另一列中,该列显示连续真值的“出现次数” 我有一个专栏 我要创建的列 真的 1. 真的 1. 真的 1. 真的 1. 假的 0 假的 0 真的 2. 真的 2. 假的 0 真的 3. 真的 3. 您可以添加一个助手列begin,如下所示,并使用窗口函数进行滚动求和: 示例数据帧: df.show() +---+-----+ | ts| col| +---+-----+ | 0| true| | 1| true| | 2| true
您可以添加一个助手列
begin
,如下所示,并使用窗口函数进行滚动求和:
示例数据帧:
df.show()
+---+-----+
| ts| col|
+---+-----+
| 0| true|
| 1| true|
| 2| true|
| 3| true|
| 4|false|
| 5|false|
| 6| true|
| 7| true|
| 8|false|
| 9| true|
| 10| true|
+---+-----+
代码:
spark数据帧是无序的。没有“连续”的概念,除非你有一个列来排序。谢谢你的评论,我应该提到的是,值是按时间戳列排序的。
w = Window.orderBy('ts')
df2 = df.withColumn(
'begin',
F.coalesce(
(F.lag('col').over(w) != F.col('col')) & F.col('col'),
F.lit(True) # take care of first row where lag is null
).cast('int')
).withColumn(
'newcol',
F.when(
F.col('col'),
F.sum('begin').over(w)
).otherwise(0)
)
df2.show()
+---+-----+-----+------+
| ts| col|begin|newcol|
+---+-----+-----+------+
| 0| true| 1| 1|
| 1| true| 0| 1|
| 2| true| 0| 1|
| 3| true| 0| 1|
| 4|false| 0| 0|
| 5|false| 0| 0|
| 6| true| 1| 2|
| 7| true| 0| 2|
| 8|false| 0| 0|
| 9| true| 1| 3|
| 10| true| 0| 3|
+---+-----+-----+------+