2016-08-10 5 views
1

私は約200KBのサイズのデータ​​セットを持っています。私は、データをクリーンアップし、スパークにRDDにそれをロード(pysparkを使用して)ヘッダフォーマットは以下となるようにしました:代替の行間の合計時間

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

このデータセットを格納し、従業員のスタンプでスタンプアウトの時間、およびI彼らが仕事に費やした時間を足し算する必要があります。行のフォーマットがきれいで、厳密に交替する(スタンプイン、スタンプアウト、スタンプイン、スタンプアウトなど)、Sparkで費やされた時間を集計する方法はありますか?

"スタンプイン"のすべての値に対してフィルタを使用して、その行の値を(r + 1)の直後に値を集計しようとしましたが、これは高価なことは言えません。私はこれがjavaやpythonのような言語で行うのは簡単だと思いますが、切り替え前にSparkで実装できる解決策がないのですか?

+0

を指定した日付と従業員のために最大で2つのタイムスタンプがあると仮定すると、あなたは、タイムスタンプの日付のための追加の列を作成することができます。その後、従業員と日付についてgroupbyを実行します。スタンプインとスタンプアウトは同じ行にあり、スパークRDD内の差を計算するのは簡単です。 – mrwyatt

+0

@mrwyatt日付ごとに2回だけではありませんが、私は従業員の名前と日付をグループ化して、データをより簡単に繰り返すことができました。ありがとう。 – 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"))