2016-08-10 41 views
1

我有一個大小約爲200KB的數據集。我已經清理數據和(使用pyspark)裝載它變成一個RDD在火花,使得報頭格式如下:交替行之間的總計時間

Employee ID | Timestamp (MM/DD/YYYY HH:MM) | Location 

該數據集存儲僱員印章在和郵票出次,我需要合計他們在工作中花費的時間。假設行的格式是乾淨的並且嚴格交替(所以印記,戳記,戳記,戳記等),是否有一種方法可以聚合在Spark中花費的時間?

我試過在所有「郵票」值上使用過濾器,然後直接在行(如此r + 1)之後用行中的值聚合時間,但是這被證明是非常困難的,更不用說昂貴。我認爲這可以直接用java或python這樣的語言來完成,但在切換之前我是否缺少可以在Spark中實現的解決方案?

+0

假設至多有2個時間戳某一天,員工,你可以爲時間戳的日期創建一個額外的列。然後在員工和日期上做一個groupby。現在,衝入和衝出是在同一行,並計算火花RDD內的差異是微不足道的。 – mrwyatt

+0

@mrwyatt每個日期不只有兩次,但我仍然在員工姓名和日期上做了groupby,以便更輕鬆地遍歷數據。謝謝。 – psak

回答

0

您可以嘗試使用窗口功能lead

from pyspark.sql import Window 
from pyspark.sql.functions import * 

window = Window.partitionBy("id").orderBy("timestamp") 
newDf = df.withColumn("stampOut", lead("timestamp", 1).over(window)).where(col("stampOut").isNotNull()) 

finalDf = newDf.select(col("id"), col("stampOut") - col("timestamp"))