1. 程式人生 > 實用技巧 >準備資料集用於flink學習

準備資料集用於flink學習

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

在學習和開發flink的過程中,經常需要準備資料集用來驗證我們的程式,阿里雲天池公開資料集中有一份淘寶使用者行為資料集,稍作處理後即可用於flink學習;

下載

  1. 下載地址:
    https://tianchi.aliyun.com/dataset/dataDetail?spm=a2c4e.11153940.0.0.671a1345nJ9dRR&dataId=649

  2. 如下圖所示,點選紅框中的圖示下載(名為UserBehavior.csv.zip的檔案太大無法在excel開啟,因此下載體積小一些的UserBehavior.csv):

  3. 該CSV檔案的內容,一共有五列,每列的含義如下表:

列名稱 說明
使用者ID 整數型別,序列化後的使用者ID
商品ID 整數型別,序列化後的商品ID
商品類目ID 整數型別,序列化後的商品所屬類目ID
行為型別 字串,列舉型別,包括('pv', 'buy', 'cart', 'fav')
時間戳 行為發生的時間戳
時間字串 根據時間戳欄位生成的時間字串
  1. 下載完畢後用excel開啟,如下圖所示:

增加一個欄位

為了便於檢查資料,接下來在時間戳欄位之後新增一個欄位,內容是將該行的時間戳轉成時間字串

  1. 如下圖,在F列的第一行位置輸入表示式,將E1的時間戳轉成字串:
  2. 上圖紅框中的表示式內容如下:
=TEXT((E1+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")
  1. !!!有個問題要格外注意!!!:上述表示式中,由於8*3600的作用,得到的時間字串實際上是東八區時區的時間,在flink sql中,如果用DATE_FORMAT函式計算timestamp也能得到時間字串,但是這個字串是格林尼治時區,此時兩個時間字串的值就不同了,例如從F列看2017/11/12和2017/11/13各一條記錄,但是DATE_FORMAT函式計算timestamp得到的卻是2017/11/12有兩條記錄,解決這個問題的辦法就是將表示式中的8*3600去掉,大家都用格林尼治時區;
  2. 表示式生效後,F1的內容就是E1的時間字串,接下來F列的所有記錄都作轉換,滑鼠放在下圖紅框位置時,會出現十字架標誌,在此標誌上雙擊滑鼠:


5. 完成後如下圖,F列的時間資訊更利於我們開發過程中核對資料:

修復亂序

  1. 此時的CSV檔案中的資料並不是按時間欄位排序的,如下圖:
  2. flink在處理上述資料時,由於亂序問題可能會導致計算結果不準,以上圖為例,在處理紅框2中的資料時,紅框3所對應的視窗早就完成計算了,雖然flink的watermark可以容忍一定程度的亂序,但是必須將容忍時間調整為7天才能將紅框3的視窗保留下來不觸發,這樣的watermark調整會導致大量資料無法計算,因此,需要將此CSV的資料按照時間排序再拿來使用;
  3. 如下圖操作即可完成排序:


4. 完成排序後如下圖所示:


至此,一份淘寶使用者行為資料集就準備完畢了,接下來的文章將會用此資料進行flink相關的實戰;

直接下載準備好的資料

  1. 為了便於您快速使用,上述調整過的CSV檔案我已經上傳到CSDN,地址:
    https://download.csdn.net/download/boling_cavalry/12381698
  2. 也可以在我的Github下載,地址:
    https://raw.githubusercontent.com/zq2599/blog_demos/master/files/UserBehavior.7z

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos