連續時間查詢問題-查詢一個使用者連續登陸天數超過N天的使用者

來源:互聯網
上載者:User

標籤:使用   資料   問題   時間   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,但是在前面已經被丟掉了。所以還是用第一種吧。這裡只是給大家一個思路。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.