標籤:使用 資料 問題 時間 sql c 設計 ad
問題:比如查詢一個使用者連續登陸天數超過7天的使用者,或者查詢連續在7天的某個時間段登陸的使用者。
網上查詢sql的語句的用法,對於hive來說也可以試試,查詢詞"SQL 連續天數查詢"
如果使用hadoop如何解決??
思路(以連續N天登陸為例):
1、計算出每天登陸的使用者集合
1、使用MR,第一個job(map以日期為key,對使用者進行分組輸出。reduce設計:內部構造一個以N容量大小的列表(作為隊列),類比一下啊(日期過來就是有序的,從小到大)
1)第一個日期過來,放在list裡面,list裡面的元素是一個map(key為日期,value為hashset 內部裝的是使用者ID))
2)第二個日期過來了,和上一個比較,如果是連續的放進去,如果不連續(就是說中間有一個日期沒有記錄),清空list,重新裝作為第一個。
3)第三個來了..................同第二部
4)第N個過來了,放入list,此時list裝了連續N個資料。這是就需要取各個元素的hashset的交集了,這樣容易吧。
輸出,以第一個日期-第N個日期為key,輸出使用者的交集(value)
5) 又來了,因為是隊列,所以如第二部和第四部,就這樣了。
----------------------
如果採用hive sql語句編寫的話,很難,因為想不出來。
試著使用pig,資料流也很麻煩。所以想了上面這個方法。
----------------------
再想想MR,貌似記憶體浪費的太多,需要構造N個hashset來儲存各個日期的使用者ID,太浪費了。事實上,我們所比較的都是以list列表的第一個為依據,因為計算的是N個日期都有的使用者ID,所以可以這樣:
1、第一個過來了,直接構造一個map,key為使用者ID,value為個數,第一次為1
2、第二個過來了,比較和第一個的日期,是否連續,不連續,刪除第一個裝第二個。連續,通過map來進行依次比較,如果有個數加1。
3、第三個過來了,需要維護一個全域變數來保證日期的有序。對map進行統計
4、。。。。。。
5、到第N個了,對map進行計算,統計value的個數是否為N,為N的就是所需要的結果。
6、貌似不行,此時我需要裝前面第二個過來的為map,但是在前面已經被丟掉了。所以還是用第一種吧。這裡只是給大家一個思路。