2016-03-21 285 views
0

我有一大堆的特點是note列在火花事件(用戶點擊/動作/按下按鈕)的:Sessionization火花

>>> df.show(20) 
+-------+-------------+------------+------+ 
| user| timestamp|  note|action| 
+-------+-------------+------------+------+ 
|2376466|1458580817381|event #1 ...|UPDATE| 
|2376466|1458580822034|event #1 ...|UPDATE| 
|2376466|1458580822112|event #2 ...|UPDATE| 
|2376466|1458580822166|event #2 ...|UPDATE| 
|2376466|1458580822216|event #2 ...|UPDATE| 
|2376466|1458580822225|event #2 ...|UPDATE| 
|2376466|1458580822651|event #1 ...|UPDATE| 
|2376466|1458580822660|event #1 ...|UPDATE| 
+-------+-------------+------------+------+ 

我想知道一個「會話」的持續時間特別是note。例如,事件#2開始於1458580822112並結束於1458580822225,因此持續時間將是..225 - ..112 = 113毫秒。是否有任何火花助手或快捷方式將數據組織到「」會話「或其他方式來提取這樣的信息?或者想法是不斷地向每行添加額外的狀態信息並在會話標識符列準備就緒時將其捲起?

注意:同一類型的多個音符應該被認爲是單獨的會話

+0

據我瞭解你的意圖可能與窗口功能,但它不漂亮或特別有效。儘管如此,我已經發布了一些類似問題的答案。總的來說,實現像這樣的RDDs(可能還包含數據集)可能更容易,但這是一個相當廣泛的問題。 – zero323

+0

你介意在表面挖掘類似的問題嗎? – Oleksiy

+0

如果我不忘記,我會在明天搜索,但它幾乎是三個基本步驟:1)確定在「會話」之間切換(滯後)2)添加會話標識符(切換點的累計和)3)某些統計信息 – zero323

回答

2

你可以利用星火-SQL來acheive你的目標 下面是一些代碼,對我的作品,其會給出會話 你可以編寫一個輔助函數,然後將其註冊爲UDF 然後可以在你的SQL語句中調用這個UDF

df.registerTempTable("Events")  
import sqlContext.implicits._ 

# (You can modify this according to what exact value have in note column.) 

def process(colname: String):String = {  
    return colname.substring(0,8)  
} 

sqlContext.udf.register("process",process _)  
val dd = sqlContext.sql("select timestamp as timestamp, process(note) as note from Events") 

dd.registerTempTable("SubEvents") 

val dt = sqlContext.sql("select last(timestamp) - first(timestamp) as session, note as note from SubEvents group by note") 

dt.show()  
+--------+--------+  
|session| note|  
+--------+--------+  
|  5|event #1|  
|  2|event #2|  
|  1|event #3|  
+--------+--------+ 

而且完全bluemix火花筆記本可以看作here: -

感謝,

查爾斯。

+0

請格式化您的代碼,這是不可讀的! – eliasah

+0

這很有幫助,但它會將所有會話合併爲一個,並確定所有事件的「最小」和「最大」時間。我想保持多個連續的事件爲一個「會話」 – Oleksiy

+0

所以你想按用戶分組? –