2016-03-01 28 views
0

我有一個數據幀在火花如下以生成針對每個組新的列值:如何使用條件

ID Sales

1  0 
1  0 
1  5000 
1  0  
1  0 
1  2000 
1  0 
2  0 
2  0 
2  3000 
2  1000 
2  0 
2  0 

現在,我想創建第三列對於每個ID,將從0開始,並在Sales列出現嚴格正值時加1。每當指標增加1時,我都希望重複該數字,直到銷售列向下行出現另一個嚴格正值。所得到的數據幀將是如下:

ID Sales Indicator 
1  0  0 
1  0  0 
1  5000 1 
1  0  1 
1  0  1 
1  2000 2 
1  0  2 
2  0  0 
2  0  0 
2  3000 1 
2  1000 2 
2  0  2 
2  0  2 

我怎麼能以高效的方式實現這一目標?我們可以使用mapPartitions嗎?我研究了窗口函數,但想不到一種方法。非常感謝你。

+1

你怎麼訂貨數據?我的意思是,你怎麼知道它是0,0,5000,0,0,2000,0而不是0,0,0,0,0,0,0,2000,5000? –

+0

按日期說;但繼承,這是不相關的 – eugenerory

回答

0

利用窗口函數,你可以做這樣的:

正如羅伯特Horvick指出的那樣,你將需要一些方法來給定的ID內排序的列,這樣的結果是確定的。比方說,你有做這列OrderingCol,讓你的數據是這樣的:

ID Sales OrderingCol 

1  0  1 
1  0  2 
1  5000  3 
1  0  4 
1  0  5 
1  2000  6 
1  0  7 
2  0  1 
2  0  2 
2  3000  3 
2  1000  4 
2  0  5 
2  0  6 

當然,就像你說的,訂貨行會的工作(按日期等)的任何方式。

然後,你可以做這樣的事情,以上數據假設在df

import org.apache.spark.sql.expressions._ 
import org.apache.spark.sql.functions._ 
import spark.implicits._ 

val ws = Window.partitionBy("ID").orderBy("OrderingCol") 
val df2 = df.withColumn("Indicator", sum(when($"Sales" > 0, 1).otherwise(0)).over(ws))