身處大資料時代,每一天都在產生資料,對于資料的應用是每一個行業的最基本的要求,也是他們立足和競爭商業世界的必要手段,在這個“化數為金”的時代,對資料的敏感程度不僅僅是那些專業人士的目標所向,而是對于每一個人的挑戰與機遇,資料分析已經成為21世紀最為廣泛的一次資訊革命,它終將成為未來最基礎的生存技能
資料挖掘——資料清洗——資料分析——資料可視化——資料語言大眾化——資料價值化


專案簡介
我們選取了12月1日-18號的資料,進行簡單的模擬大資料分析(6萬多條,實際專案一般是上億,檔案大小都是TB級,一般的軟體無法分析處理,只可以借助Hadoop大資料分析)




專案條件
1.首先要準備資料集

2.準備環境,Hadoop集群,需要hdfs,hive,Fiume,sqoop等插件,需要提前自己安裝,使用12月資料做一個分析
專案步驟
1.啟動Hadoop集群并查看
start-all.sh
jps

2.配置表支持事務(十分重要)
2.1 改組態檔hive-site.xml 或者 臨時設定引數 命令列
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>1</value>
<!--這里的執行緒數必須大于0 :理想狀態和分桶數一致-->
</property>
<property>
<name>hive.enforce.bucketing</name>
<value>true</value>
</property>
首先在Hadoop計算機里面找到這個檔案,因為組態檔已經存在了,我們只需要在后面添加上面的資料即可,操作步驟截圖如下:

注意這里修改的是hive檔案下面的,也就是第一個檔案,不是第二個flume!



2.2 使用vi命令,新建一個file_hive.properties檔案,把下面的資料插入到里面
#定義agent名, source、channel、sink的名稱
agent3.sources = source3
agent3.channels = channel3
agent3.sinks = sink3
#具體定義source
agent3.sources.source3.type = spooldir
agent3.sources.source3.spoolDir = /home/hadoop/taobao/data
agent3.sources.source3.fileHeader=false
#設定channel型別為磁盤
agent3.channels.channel3.type = file
#file channle checkpoint檔案的路徑
agent3.channels.channel3.checkpointDir=/home/hadoop/taobao/tmp/point
# file channel data檔案的路徑
agent3.channels.channel3.dataDirs=/home/hadoop/taobao/tmp
#具體定義sink
agent3.sinks.sink3.type = hive
agent3.sinks.sink3.hive.metastore = thrift://hadoop:9083
agent3.sinks.sink3.hive.database = taobao
agent3.sinks.sink3.hive.table = taobao_data
agent3.sinks.sink3.serializer = DELIMITED
agent3.sinks.sink3.serializer.delimiter = ","
agent3.sinks.sink3.serializer.serdeSeparator = ','
agent3.sinks.sink3.serializer.fieldnames = user_id,item_id,behavior_type,user_geohash,item_category,date,hour
agent3.sinks.sink3.batchSize = 90
#組裝source、channel、sink
agent3.sources.source3.channels = channel3
agent3.sinks.sink3.channel = channel3
vi file_hive.properties

該檔案用于監聽的作用,自動就會在家目錄下面,然后我們需要創建幾個檔案夾,就是下圖我備注的那些欄位

mkdir -p /home/hadoop/taobao/data
mkdir -p /home/hadoop/taobao/tmp/point

3.3 創建資料庫
由于版本問題,需要匯入指定的jar包
把${HIVE_HOME}/hcatalog/share/hcatalog/下的所有包,拷貝入${FLUME_HOME}/lib
執行下面的命令:
cd ${HIVE_HOME}/hcatalog/share/hcatalog/
cp * ${FLUME_HOME}/lib/

啟動hive
hive
創建資料庫并使用
create database taobao;
use taobao;
建立表格
create table `taobao`.`taobao_data` (
`user_id` varchar(255) ,
`item_id` varchar(255) ,
`behavior_type` varchar(255) ,
`user_geohash` varchar(255) ,
`item_category` varchar(255) ,
`date` varchar(10) ,
`hour` varchar(3)
)
clustered by(user_id) into 3 buckets
row format delimited fields terminated by ','
stored as orc tblproperties('transactional'='true');
創建匯出資料表
create table `taobao`.`taobao_result` (
`key` varchar(255) ,
`value` varchar(255)) ;

4.匯入資料
先啟動hive --service metastore -p 9083
(這個埠號要配置到flume檔案中,可用netstat -tulpn | grep 9083查看埠是否監聽)
hive --service metastore -p 9083
再去啟動flume
flume-ng agent --conf conf --conf-file file_hive.properties -name agent3 -Dflume.hadoop.logger=INFO,console
然后把檔案資料匯入到,之前創建的data檔案夾里面就完成了自動匯入
mv /home/hadoop/12yue.csv /home/hadoop/taobao/data/

5.資料分析
5.1 把總訪問量查詢出來,匯入到結果表
insert into taobao_result
(select "PV", u. `總訪問量` FROM
(select count(*) AS `總訪問量` FROM taobao_data) u);

INSERT INTO taobao_result
(SELECT " UV", u. `用戶數量` FROM
(SELECT COUNT(DISTINCT user_id) AS `用戶數量` FROM taobao_data) u);

可以查看一下
select * from taobao_result;

5.2 – 瀏覽頁跳失率:用戶僅僅有pv行為,沒有其它的收藏、加購、購買行為
INSERT INTO taobao_result
(SELECT "跳失率", u. `總訪問量` FROM
(
SELECT b.`僅pv用戶` / a.`總用戶` AS `總訪問量` FROM
(SELECT count( DISTINCT user_id ) AS `總用戶` FROM taobao_data) a ,
(SELECT
count( DISTINCT user_id ) AS `僅pv用戶`
FROM taobao_data
WHERE
user_id NOT IN ( SELECT DISTINCT user_id FROM taobao_data WHERE behavior_type = '2' ) AND
user_id NOT IN ( SELECT DISTINCT user_id FROM taobao_data WHERE behavior_type = '3' ) AND
user_id NOT IN ( SELECT DISTINCT user_id FROM taobao_data WHERE behavior_type = '4' )) b
) u);
注意在hive里面不可以使用in not in查詢,所以這里要用連接查詢解決這個問題
經過大量的測驗,我自己寫了一個sq陳述句,也可以達到以上的效果
首先把要插入的資訊,查詢出來
SELECT "跳失率", u.`總訪問量` FROM
(
SELECT b.`僅pv用戶` / a.`總用戶` AS `總訪問量` FROM
(SELECT count( DISTINCT user_id ) AS `總用戶` FROM taobao_data) a,
(SELECT count( DISTINCT user_id ) AS `僅pv用戶` from (select * from taobao_data) as c LEFT JOIN (SELECT DISTINCT user_id as `id` FROM taobao_data WHERE behavior_type = '2' or behavior_type='3' or behavior_type='4') as d on c.user_id=d.id WHERE d.id is NULL ) as b
) as u;
插入
INSERT INTO taobao_result
(SELECT "跳失率", u.`總訪問量` FROM
(
SELECT b.`僅pv用戶` / a.`總用戶` AS `總訪問量` FROM
(SELECT count( DISTINCT user_id ) AS `總用戶` FROM taobao_data) a,
(SELECT count( DISTINCT user_id ) AS `僅pv用戶` from (select * from taobao_data) as c LEFT JOIN (SELECT DISTINCT user_id as `id` FROM taobao_data WHERE behavior_type = '2' or behavior_type='3' or behavior_type='4') as d on c.user_id=d.id WHERE d.id is NULL ) as b
) as u);


5.3
– 有購買行為的用戶數量、用戶的購物情況、復購率分別是多少?
SELECT COUNT( 1 ) FROM (SELECT u.user_id, SUM( CASE u.behavior_type WHEN "4" THEN 1 ELSE 0 END ) AS buy FROM taobao_data u GROUP BY u.user_id HAVING buy > 0 ) t;

SELECT COUNT(1) AS `總數`, SUM(CASE u.behavior_type WHEN "1" THEN 1 ELSE 0 END ) AS `點擊行為`,SUM(CASE u.behavior_type WHEN "2" THEN 1 ELSE 0 END ) AS `收藏行為`,SUM(CASE u.behavior_type WHEN "3" THEN 1 ELSE 0 END ) AS `加購物車行為`,SUM(CASE u.behavior_type WHEN "4" THEN 1 ELSE 0 END ) AS `購買行為` FROM taobao_data u;

5.4 – 復購率 購買次數大于2的人占總的人數的比率
必須要輸入下面代碼
原因如下
set hive.mapred.mode=nonstrict;
注意這個sq陳述句里面的4,必須也要用單引號括起來
SELECT t2.repeat_buy/t1.total AS `復購率` FROM
(SELECT COUNT(DISTINCT u1.user_id) AS total FROM taobao_data u1) t1 ,
(SELECT COUNT(1) AS repeat_buy FROM
(SELECT u.user_id, SUM(CASE u.behavior_type WHEN '4' THEN 1 ELSE 0 END ) AS buy FROM taobao_data u GROUP BY u.user_id HAVING buy>1) t) t2;

5.5 分析用戶在哪個時間段最為活躍,包括日期和時間
SELECT `date`,count(*) as `t` from taobao_data GROUP BY `date` ORDER BY `t` DESC;

SELECT `hour`,count(*) as `t` from taobao_data GROUP BY `hour` ORDER BY `t` DESC;

匯出資料
去自己的Navicat里面執行去試試也可以
CREATE DATABASE taobao;
create table `taobao`.`taobao_result` (
`key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
虛擬機執行也可以
show create table taobao_result

在終端界面運行
sqoop export --connect jdbc:mysql://localhost:3306/taobao --username root -P --table taobao_result --export-dir /user/hive/warehouse/taobao.db/taobao_result -m 1 --input-fields-terminated-by '\001'
查詢一下資料是否匯入成功

OK!
可視化展示——基于Python里面的pyecharts庫

1.有不同的用戶訪問,按照IP地址來確定,對比之后用戶點擊率還是比較高的,和用戶人數形成了極差,說明該電商還是比較吸引人,有大量的瀏覽量,說明網站還是比較吸引人,流量價值比較高,可以加大對廣告的投入賺取利益,
2.只看不買不收藏的用戶占比總人數約1/3,說明還是比較可觀,可以加大對網站資訊化的建設以及,吸引更多的人,同時減少跳失率



3.通過對用戶的購買行為資料分析可知,用戶主要對其內容感興趣,訪問量比較的大說明網站的種類還是比較的豐富,用戶喜歡逛,但綜合下來購買占比相對較少,但網站的流量比較大,可以發揮該優勢,提高用戶的收藏率和購買率,以及加入購物車行為,這就需要增加產品的質量,吸引更多的人愿意一次性購買(淘寶的特點,都喜歡逛)
有圖可知,復購率約占比4/25,說明二次購買的人數還是不夠多,需要加強質量管理,同時增加一些二次購買福利,留住顧客

分析可得用戶喜歡在活動前后大幅度瀏覽網站,同時大部分人喜歡在6點(下班之后)瀏覽網頁,到了晚上9點和10點帶到高峰,建議在這段時間加強對網站的維護和廣告的投入,達到相關的作用
專案總結
對于hive里面的資料操作,最為重要的就是sq陳述句的書寫:
1.在MySQL里面可以運行的sq陳述句在hive里面未必可以運行成功,因為hive對sq陳述句要求的更為嚴格,其次hive里面不支持in not in 子查詢,我們需要使用left join on 或者其他方法去實作相關功能的查詢,
2.hive里面有時會報一些欄位錯誤,那么很有可能就是sq陳述句書寫的不夠規范,其次在MySQL里面可以用‘’來表示子查詢字串,也就是一些表的欄位名,但是hive里面有時候需要用Esc下面的那個符號,建議最好使用那個,以免報錯,另外在使用sq陳述句在hive里面創建表格的時候注意大小寫,create table …
3.匯入資料的時候注意步驟不要出錯了以及一些組態檔,
4.使用sqoop匯出資料需要在mysql 里面提前創建好表格,從hive表匯出,最終在MySQL里面進行相關查詢,以及可視化分析,
5.只要hive報錯語法錯誤,那么就按照最標準的語法格式書寫準沒錯,親測實用!
思路:首先準備好組態檔以及資料,匯入只需移動進去,匯出還需要查看該表的位置,至于中間的資料分析,必須熟練的掌握MySQL的查詢語法,
我們在想,要是Python可以直接連接hive就好了,那么我們在Python環境里面執行查詢陳述句,自動把資料集傳給變數,然后利用可視化庫進行展示,一鍵化豈不是很方便,確實可以,這個需要安裝一些Python第三方庫連接虛擬機里面的hive,這樣我們進行大資料分析也就方便多了,
每文一語
學會嘗試,說不定下一個幸運兒就是你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230704.html
標籤:其他
