2014-06-26 18 views
0

Hadoop新手在這裏。我有一些用戶的事件日誌這樣,與用戶ID時間戳兩個隨機排序:Python Hadoop流媒體,二級排序問題

userid timestamp   serviceId 
aaa 2012-01-01 13:12:23 4 
aaa 2012-01-01 12:11:52 3 
ccc 2012-01-03 08:13:07 3 
bbb 2012-01-02 02:34:12 8 
aaa 2012-01-02 01:09:47 4 
ccc 2012-01-02 12:15:39 4 

我想要得到的中間結果通過用戶ID排序,然後時間戳,象下面這樣:

aaa 2012-01-01 12:11:52 3 
aaa 2012-01-01 13:12:23 4 
aaa 2012-01-02 01:09:47 4 
bbb 2012-01-02 02:34:12 8 
ccc 2012-01-02 12:15:39 4 
ccc 2012-01-03 08:13:07 3 

因此,它可以很容易地被我的Reducer解析。

最終目標是計算用戶如何將時間花在不同的服務(serviceIds)上。這是否可以使用Python Hadoop流實現?如果不是,那麼你會建議什麼更好的方法?感謝一堆!

回答

1

在你的映射器,你可以發出userid關鍵和timestampserviceIdtimestamp排序值(進行排序操作,我假設每個用戶的所有行可以容納在主內存中)。

然後,MR框架將負責將每個用戶的所有不同行發送給一個reducer,並且您可以輕鬆地在那裏執行分析。

如果每個用戶的行數太多(例如數百萬),則可以發出userId-serviceId作爲關鍵字,並且在縮小階段之後,每個user-service有一行文件,並且花費在該服務上的時間。如果你願意,你可以加入所有這些文件使用getmerge

+0

太好了,謝謝!因此,使用'userId'或'userId-serviceId'作爲鍵,基本上我需要在我的Reducers中按'timestamp'對值進行排序。如果我希望Mapper的輸出在到達Reducer之前已按時間戳排序,那該怎麼辦?我知道我可以在Java中指定一個自定義分區程序(使用'userId-timestamp'作爲組合鍵,但在'userId'上進行分區),但是在Python流中也可以這麼做嗎?謝謝! – xiaolong

+0

是的,您可以將'userid-timestamp'設置爲關鍵字,然後使用hadoop streaming的'-partitioner'子句通過'userid'進行分區。在官方文檔中查看[this example](http://hadoop.apache.org/docs/r1.2.1/streaming.html#Hadoop+Partitioner+Class)。 –

+0

有幫助,謝謝! – xiaolong