1.大資料工具簡單分析天貓年底月銷量
阿新 • • 發佈:2019-01-04
1.引言
在線上交易早已成熟的今天,電商交易量究竟有多少?為了清晰地比較天貓月銷量,本文爬取了天貓2017年底、2018年初主流分類商品大量資料,並做了簡單的資料統計。整體流程如下:
說明:利用scrapy爬取天貓店鋪資料約50萬
條,匯入HDFS
分散式儲存,利用大資料元件spark
操作運算元分析及sparkSQL
查詢分析得出處理結果,最後,EChart
前端元件將結果以圖表形式展現出來。
2.分析過程
2.1 scrapy爬取天貓資料
Scrapy
是Python
開發的一個快速、高層次的爬蟲框架,用於抓取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
物件獲得RDD
及DataSets
進行後續分析操作。
對整個結果資料,我們以二級分類為分組,對每個商品的月銷量進行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) 對全部資料按銷量排序,結果如下: