1. 程式人生 > >1.大資料工具簡單分析天貓年底月銷量

1.大資料工具簡單分析天貓年底月銷量

1.引言

在線上交易早已成熟的今天,電商交易量究竟有多少?為了清晰地比較天貓月銷量,本文爬取了天貓2017年底、2018年初主流分類商品大量資料,並做了簡單的資料統計。整體流程如下:

這裡寫圖片描述

說明:利用scrapy爬取天貓店鋪資料約50萬條,匯入HDFS分散式儲存,利用大資料元件spark操作運算元分析及sparkSQL查詢分析得出處理結果,最後,EChart前端元件將結果以圖表形式展現出來。

2.分析過程

2.1 scrapy爬取天貓資料

  • ScrapyPython開發的一個快速、高層次的爬蟲框架,用於抓取web站點並從頁面中提取結構化的資料。

首先爬取天貓首頁分類資料,如一級分類:女裝、男裝

二級分類:羽絨服女、針織衫女等。結果儲存為class.json,部分資料如下:

{"class2": ["羽絨服女", "毛呢外套女", "毛衣女", "針織衫女", "棉服女", "連衣裙",  "風衣女裝", "褲子女裝", "衛衣女裝", "T恤女裝", "襯衫女裝", "半身裙", "西裝女", "打底衫女", "夾克女", "皮衣女", "媽媽裝","婚紗禮服"], "class1": "女裝"}
{"class2": ["外套男裝", "夾克男裝", "襯衫男裝", "T恤男裝", "棒球服男裝", "牛仔外套男裝", "衛衣男裝", "西裝男", "風衣男裝", "皮衣男裝"
, "針織衫男裝", "呢大衣男裝", "休閒褲男裝", "牛仔褲男裝", "運動褲男裝", "九分褲男裝", "馬甲男裝", "羽絨服男裝", "棉衣男", "中老年男裝"]
, "class1": "男裝"} ... {"class2": ["沙發", "床", "餐桌", "床墊", "茶几", "電視櫃", "衣櫃", "鞋櫃", "椅凳", "書桌", "電腦桌", "現代簡約傢俱", "美式傢俱", "北歐傢俱", "中式傢俱", "兒童傢俱", "真皮沙發", "布藝沙發", "皮床", "實木床", "兒童床", "乳膠床墊", "兒童學習桌", "書架", "椅子", "電腦椅"
]
, "class1": "傢俱"} {"class2": ["iphone", "榮耀", "三星", "小米", "華為", "魅族", "oppo", "vivo"], "class1": "手機"} ...

獲取上述{key:value}後,我們以search=value的方式(等同於在頁面搜尋框輸入關鍵字)進一步爬取店鋪資料,對於每一個店鋪我們獲取到一級分類、二級分類、商品名稱、價格、月銷售量、店鋪名稱{class1, class2, title, sales, price, store},對於每一個搜尋的商品,我們按銷量獲取約前1000個店鋪(最多1020個店鋪)。資料形式如下:

{"title": "清倉薄款連帽韓版羽絨服", "price": "189.90", "sales": 44000.0, "class2": "羽絨服女", "store": "翼素", "class1": "女裝"}
{"title": "可自提", "price": "499.00", "sales": 37000.0, "class2": "羽絨服女", "store": "優衣庫官方旗艦店", "class1": "女裝"}
...
{"title": "Apple/蘋果", "price": "8168.00", "sales": 67000.0, "class2": "iphone", "store": "卓辰數碼旗艦店", "class1": "手機"}
{"title": "Apple/蘋果", "price": "9688.00", "sales": 67000.0, "class2": "iphone", "store": "蘇寧易購官方旗艦店", "class1": "手機"}
...

2.2 spark資料分析

  • HDFS,即Hadoop分散式檔案系統(HDFS),能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。
  • Spark 是一種與 Hadoop 相似的開源叢集計算環境,是專為大規模資料處理而設計的快速通用的計算引擎,其中間輸出結果可以儲存在記憶體中,從而不再需要每次讀寫HDFS。

首先,將結果檔案傳輸至HDFS:

hadoop fs -put /folder/origin/... /folder/...

為了描述商品結構,我們建立javabean:

public class Product{
    private String class1;
    private String class2;
    private int price;
    private int  sales;
    private String store;
    private String title;
    ...
}

通過建立SparkSession物件獲得RDDDataSets進行後續分析操作。
對整個結果資料,我們以二級分類為分組,對每個商品的月銷量進行reduce操作或sql分組求和,以總銷量降序排序:

String sqlText = "SELECT class2 ,class1,sum(CAST(sales AS DOUBLE)) as sum_sales,count(class2) AS class2_num 
                FROM tmalldata GROUP BY class2,class1 ORDER BY sum_sales DESC";

我們先選取部分分析結果,並做資料修正,原結果資料如下:

+------+------+-----------+----------+
|class2|class1|  sum_sales|class2_num|
+------+------+-----------+----------+
|  褲子女|    女裝|1.7876922E7|      1020|
|    蘋果|    生鮮|1.4588863E7|      1020|
|    堅果|    零食|1.3379527E7|      1020|
|    秋褲|    內衣|1.2177041E7|      1020|
|  保暖內衣|    內衣|1.1318308E7|      1020|

我們發現蘋果堅果銷量過大,檢視原店鋪資料,發現有分類交叉干擾:

{"title": "Apple/", "price": "6688.00", "sales": 58000.0, "class2": "蘋果", "store": "蘇寧易購官方旗艦店", "class1": "生鮮"}
...
{"title": "Aosailo iPhone6電池", "price": "58.00", "sales": 97000.0, "class2": "蘋果", "store": "aosailo旗艦店", "class1": "生鮮"}
...
{"title": "平安夜/", "price": "45.90", "sales": 34000.0, "class2": "蘋果", "store": "禧愛壹家旗艦店", "class1": "生鮮"}
...

修正資料,取部分排名靠前資料如下:

+------+------+-----------+----------+
|class2|class1|  sum_sales|class2_num|
+------+------+-----------+----------+
|  褲子女|    女裝|1787.69萬|      1020|
|    秋褲|    內衣|1217.70萬|      1020|
|  保暖內衣|    內衣|1131.83萬|      1020|
|    棉襪|    內衣|  9809210.0|      1020|
|  打底衫女|    女裝|  8715402.0|      1020|
|  外套男裝|    男裝|  8641977.0|      1020|
| 休閒褲男|    男裝|  8609225.0|      1020|
|    男鞋|    鞋靴|  8176627.0|      1020|
|    餅乾|    零食|  7864698.0|      1020|
|iphone|    手機|  7321395.0|       331|
|  男士襪子|    內衣|  6933028.0|      1020|
|   毛衣女|    女裝|  6290753.0|      1020|
|    抽紙|  個人護理|  6096333.0|      1020|
|  針織衫女|    女裝|  5841158.0|      1020|
| 牛仔褲男|    男裝|  5824355.0|      1020|
|   棉衣男|    男裝|  5569577.0|      1020|
| 針織衫男|    男裝|  5441920.0|      1020|
|    手套|  配件配飾|  5284268.0|      1020|
| 珊瑚絨睡衣|    內衣|  5129904.0|      1020|
|   清潔劑|  個人護理|  4862618.0|      1020|
|    板鞋|    鞋靴|  4853351.0|      1020|
|    靴子|    鞋靴|  4763410.0|      1020|
|    小米|    手機|  4746490.0|      1020|
|    潔面|    美妝|  4727331.0|       960|
|  兒童褲子|  童裝玩具|  4694670.0|      1020|
|   棉襪女|    內衣|  4651058.0|      1020|
|    牛肉|    生鮮|  4630011.0|      1020|
|   內褲女|    內衣|  4612125.0|      1020|
|  長袖睡衣|    內衣|  4508023.0|      1020|
|    圍巾|  配件配飾|  4426260.0|      1020|
|   內褲男|    內衣|  4417667.0|      1020|
|   巧克力|    零食|  4368916.0|      1020|
| 運動褲男裝|    男裝|  4332190.0|      1020|
|    面膜|    美妝|  4282905.0|       900|
|    乳液|    美妝|  4207855.0|       900|
|    檸檬|    生鮮|  4167727.0|      1020|
|    帽子|  配件配飾|  4166215.0|      1020|
|    童鞋|  童裝玩具|  3931569.0|      1020|
|  衛衣男裝|    男裝|  3862480.0|      1020|
|   雪地靴|    鞋靴|  3851849.0|      1020|
|   洗髮水|  個人護理|  3812539.0|      1020|
|  oppo|    手機|  3725865.0|       361|
|  T恤男裝|    男裝|  3696852.0|      1020|
|   衛生巾|  個人護理|  3568475.0|      1020|
|    牛奶|    美食|  3537466.0|      1020|
|  男士睡衣|    內衣|  3532434.0|      1020|
|    繪本|  兒童讀物|  3492248.0|       636|
...

2.3 圖表展示

  • ECharts,一個使用 JavaScript 實現的開源視覺化庫,可以流暢的執行在 PC 和移動裝置上,可高度個性化定製的資料視覺化圖表。

(1) 對全部資料按銷量排序,結果如下: