我有一列二进制传感器数据。
答案 0 :(得分:1)
我首先查看了您的其他重复问题(之后被标记为重复),所以我将回答这个问题。
是的,您可以使用窗口函数,就像在使用partition by命令的查询中一样。见How to find longest sequence of consecutive dates?
使用类似的方法,但通过数据帧转换,您可以实现相同的目标。
from pyspark.sql import Window
from pyspark.sql.functions import row_number
lst=[[1,1],[2,1],[3,1],[4,1],[5,0],[6,0],[7,0],[8,1],[9,1],[10,1]]
df=spark.createDataFrame(lst,['ID','Sensor'])
#define the window specification
w=Window.partitionBy(df['Sensor']).orderBy(df['ID'])
group_df=df.select('*',(df['ID']-row_number().over(w)).alias('grp')).orderBy('ID')
count_df=group_df.groupBy('grp').count()
#get result by joining sequence counts df back to df containing original columns
group_df\
.join(count_df,count_df['grp']==group_df['grp'])\
.select('ID','Sensor','count')\
.filter('Sensor=1')\
.orderBy('ID')\
.show()
产生所需的序列长度:
+---+------+-----+
| ID|Sensor|count|
+---+------+-----+
| 1| 1| 4|
| 2| 1| 4|
| 3| 1| 4|
| 4| 1| 4|
| 8| 1| 3|
| 9| 1| 3|
| 10| 1| 3|
+---+------+-----+
答案 1 :(得分:0)
您可以使用RDD.mapPartitions实现您描述的解决方法(在节点上收集)。这允许您提供映射到整个分区的函数,这意味着您可以迭代数据子集中的连续样本。请注意,您需要确保使用1
确定分区的开始或结束时间,并在分区之间组合序列。它可能有点难看,但应该是可能的。
请注意,如果您的数据尚未提供,则需要先sort
。