Spark识别日期和时间

时间:2017-07-26 16:33:14

标签: apache-spark pyspark spark-dataframe

我有一列二进制传感器数据。

2 个答案:

答案 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

相关问题