国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

這篇具有很好參考價值的文章主要介紹了大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

1 案例簡介

大數(shù)據(jù)課程實(shí)驗案例:網(wǎng)站用戶行為分析,由廈門大學(xué)數(shù)據(jù)庫實(shí)驗室團(tuán)隊開發(fā),旨在滿足全國高校大數(shù)據(jù)教學(xué)對實(shí)驗案例的迫切需求。本案例涉及數(shù)據(jù)預(yù)處理、存儲、查詢和可視化分析等數(shù)據(jù)處理全流程所涉及的各種典型操作,涵蓋Linux、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系統(tǒng)和軟件的安裝和使用方法。案例適合高校(高職)大數(shù)據(jù)教學(xué),可以作為學(xué)生學(xué)習(xí)大數(shù)據(jù)課程后的綜合實(shí)踐案例。通過本案例,將有助于學(xué)生綜合運(yùn)用大數(shù)據(jù)課程知識以及各種工具軟件,實(shí)現(xiàn)數(shù)據(jù)全流程操作。各個高??梢愿鶕?jù)自己教學(xué)實(shí)際需求,對本案例進(jìn)行補(bǔ)充完善。

1.1 案例目的

熟悉Linux系統(tǒng)、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系統(tǒng)和軟件的安裝和使用;
了解大數(shù)據(jù)處理的基本流程;
熟悉數(shù)據(jù)預(yù)處理方法;
熟悉在不同類型數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)相互導(dǎo)入導(dǎo)出;
熟悉使用R語言進(jìn)行可視化分析;
熟悉使用Elipse編寫Java程序操作HBase數(shù)據(jù)庫。

1.2 適用對象

高校(高職)教師、學(xué)生
大數(shù)據(jù)學(xué)習(xí)者

1.3 時間安排

本案例可以作為大數(shù)據(jù)入門級課程結(jié)束后的“大作業(yè)”,或者可以作為學(xué)生暑期或寒假大數(shù)據(jù)實(shí)習(xí)實(shí)踐基礎(chǔ)案例,完成本案例預(yù)計耗時7天。

1.4 預(yù)備知識

需要案例使用者,已經(jīng)學(xué)習(xí)過大數(shù)據(jù)相關(guān)課程(比如入門級課程《大數(shù)據(jù)技術(shù)原理與應(yīng)用》),了解大數(shù)據(jù)相關(guān)技術(shù)的基本概念與原理,了解Windows操作系統(tǒng)、Linux操作系統(tǒng)、大數(shù)據(jù)處理架構(gòu)Hadoop的關(guān)鍵技術(shù)及其基本原理、列族數(shù)據(jù)庫HBase概念及其原理、數(shù)據(jù)倉庫概念與原理、關(guān)系型數(shù)據(jù)庫概念與原理、R語言概念與應(yīng)用。
不過,由于本案例提供了全部操作細(xì)節(jié),包括每個命令和運(yùn)行結(jié)果,所以,即使沒有相關(guān)背景知識,也可以按照操作說明順利完成全部實(shí)驗。

1.5 硬件要求

本案例在集群環(huán)境下完成。

1.6 軟件工具

本案例所涉及的系統(tǒng)及軟件
Linux系統(tǒng)(Ubuntu16.04或14.04或18.04)
MySQL(版本無要求)
Hadoop(3.0以上版本)
HBase(1.1.2或1.1.5,HBase版本需要和Hadoop版本兼容)
Hive(1.2.1,Hive需要和Hadoop版本兼容,不要安裝Hive3.0以上版本)
R(版本無要求)
Eclipse(版本無要求)
不需要Sqoop,因為Sqoop無法支持Hadoop3.0以上版本

1.7 數(shù)據(jù)集

網(wǎng)站用戶購物行為數(shù)據(jù)集2000萬條記錄。

1.8 案例任務(wù)

安裝Linux操作系統(tǒng)
安裝關(guān)系型數(shù)據(jù)庫MySQL
安裝大數(shù)據(jù)處理框架Hadoop
安裝列族數(shù)據(jù)庫HBase
安裝數(shù)據(jù)倉庫Hive
安裝Sqoop
安裝R
安裝Eclipse
對文本文件形式的原始數(shù)據(jù)集進(jìn)行預(yù)處理
把文本文件的數(shù)據(jù)集導(dǎo)入到數(shù)據(jù)倉庫Hive中
對數(shù)據(jù)倉庫Hive中的數(shù)據(jù)進(jìn)行查詢分析
使用Java API將數(shù)據(jù)從Hive導(dǎo)入MySQL
使用Java API將數(shù)據(jù)從MySQL導(dǎo)入HBase
使用HBase Java API把數(shù)據(jù)從本地導(dǎo)入到HBase中
使用R對MySQL中的數(shù)據(jù)進(jìn)行可視化分析

1.9 實(shí)驗步驟

步驟零:實(shí)驗環(huán)境準(zhǔn)備
步驟一:本地數(shù)據(jù)集上傳到數(shù)據(jù)倉庫Hive
步驟二:Hive數(shù)據(jù)分析
步驟三:Hive、MySQL、HBase數(shù)據(jù)互導(dǎo)
步驟四:利用R進(jìn)行數(shù)據(jù)可視化分析

2 本地數(shù)據(jù)上傳到數(shù)據(jù)倉庫Hive

本節(jié)介紹數(shù)據(jù)集的下載、數(shù)據(jù)集的預(yù)處理和導(dǎo)入數(shù)據(jù)庫。

2.1 實(shí)驗數(shù)據(jù)集的下載

本案例采用的數(shù)據(jù)集為user.zip,包含了一個大規(guī)模數(shù)據(jù)集raw_user.csv(包含2000萬條記錄),和一個小數(shù)據(jù)集small_user.csv(只包含30萬條記錄)。小數(shù)據(jù)集small_user.csv是從大規(guī)模數(shù)據(jù)集raw_user.csv中抽取的一小部分?jǐn)?shù)據(jù)。之所以抽取出一少部分記錄單獨(dú)構(gòu)成一個小數(shù)據(jù)集,是因為,在第一遍跑通整個實(shí)驗流程時,會遇到各種錯誤,各種問題,先用小數(shù)據(jù)集測試,可以大量節(jié)約程序運(yùn)行時間。等到第一次完整實(shí)驗流程都順利跑通以后,就可以最后用大規(guī)模數(shù)據(jù)集進(jìn)行最后的測試。

在個人電腦中打開百度云網(wǎng)盤頁面進(jìn)行數(shù)據(jù)集的下載:https://pan.baidu.com/s/1nuOSo7B 。在個人電腦終端使用scp將個人電腦中的數(shù)據(jù)集上傳到服務(wù)器/home/hadoop/Download路徑。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
下面需要把user.zip進(jìn)行解壓縮,我們需要首先建立一個用于運(yùn)行本案例的目錄bigdatacase,請執(zhí)行以下命令:

sudo mkdir bigdatacase
//這里會提示你輸入當(dāng)前用戶(本教程是hadoop用戶名)的密碼
//下面給hadoop用戶賦予針對bigdatacase目錄的各種操作權(quán)限
sudo chown -R hadoop:hadoop ./bigdatacase
cd bigdatacase
//下面創(chuàng)建一個dataset目錄,用于保存數(shù)據(jù)集
mkdir dataset

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

//下面就可以解壓縮user.zip文件
cd ~/Download
unzip user.zip -d /usr/local/bigdatacase/dataset
cd /usr/local/bigdatacase/dataset
ls

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
現(xiàn)在你就可以看到在dataset目錄下有兩個文件:raw_user.csv和small_user.csv。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
我們執(zhí)行下面命令取出前面5條記錄看一下:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
可以看出,每行記錄都包含5個字段,數(shù)據(jù)集中的字段及其含義如下:

user_id(用戶id)
item_id(商品id)
behaviour_type(包括瀏覽、收藏、加購物車、購買,對應(yīng)取值分別是1、2、3、4)
user_geohash(用戶地理位置哈希值,有些記錄中沒有這個字段值,所以后面我們會用腳本做數(shù)據(jù)預(yù)處理時把這個字段全部刪除)
item_category(商品分類)
time(該記錄產(chǎn)生時間)

2.2 數(shù)據(jù)集的預(yù)處理

(1)刪除文件第一行記錄,即字段名稱

raw_user和small_user中的第一行都是字段名稱,我們在文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)倉庫Hive中時,不需要第一行字段名稱,因此,這里在做數(shù)據(jù)預(yù)處理時,刪除第一行。

cd /usr/local/bigdatacase/dataset
//下面刪除raw_user中的第1行
sed -i '1d' raw_user.csv //1d表示刪除第1行,同理,3d表示刪除第3行,nd表示刪除第n行
//下面刪除small_user中的第1行
sed -i '1d' small_user.csv
//下面再用head命令去查看文件的前5行記錄,就看不到字段名稱這一行了
head -5 raw_user.csv
head -5 small_user.csv

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

(2)對字段進(jìn)行預(yù)處理

下面對數(shù)據(jù)集進(jìn)行一些預(yù)處理,包括為每行記錄增加一個id字段(讓記錄具有唯一性)、增加一個省份字段(用來后續(xù)進(jìn)行可視化分析),并且丟棄user_geohash字段(后面分析不需要這個字段)。
下面我們要建一個腳本文件pre_deal.sh,請把這個腳本文件放在dataset目錄下,和數(shù)據(jù)集small_user.csv放在同一個目錄下:

cd /usr/local/bigdatacase/dataset
vim pre_deal.sh

上面使用vim編輯器新建了一個pre_deal.sh腳本文件,請在這個腳本文件中加入下面代碼:

#!/bin/bash
#下面設(shè)置輸入文件,把用戶執(zhí)行pre_deal.sh命令時提供的第一個參數(shù)作為輸入文件名稱
infile=$1
#下面設(shè)置輸出文件,把用戶執(zhí)行pre_deal.sh命令時提供的第二個參數(shù)作為輸出文件名稱
outfile=$2
#注意?。∽詈蟮?infile > $outfile必須跟在}’這兩個字符的后面
awk -F "," 'BEGIN{
        srand();
        id=0;
        Province[0]="山東";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陜西";Province[5]="內(nèi)蒙古";Province[6]="上海市";
        Province[7]="北京市";Province[8]="重慶市";Province[9]="天津市";Province[10]="福建";Province[11]="廣東";Province[12]="廣西";Province[13]="云南"; 
        Province[14]="浙江";Province[15]="貴州";Province[16]="新疆";Province[17]="西藏";Province[18]="江西";Province[19]="湖南";Province[20]="湖北";
        Province[21]="黑龍江";Province[22]="吉林";Province[23]="遼寧"; Province[24]="江蘇";Province[25]="甘肅";Province[26]="青海";Province[27]="四川";
        Province[28]="安徽"; Province[29]="寧夏";Province[30]="海南";Province[31]="香港";Province[32]="澳門";Province[33]="臺灣";
    }
    {
        id=id+1;
        value=int(rand()*34);       
        print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value]
    }' $infile > $outfile

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
使用awk可以逐行讀取輸入文件,并對逐行進(jìn)行相應(yīng)操作。其中,-F參數(shù)用于指出每行記錄的不同字段之間用什么字符進(jìn)行分割,這里是用逗號進(jìn)行分割。處理邏輯代碼需要用兩個英文單引號引起來。 $infile是輸入文件的名稱,我們這里會輸入raw_user.csv,$outfile表示處理結(jié)束后輸出的文件名稱,我們后面會使用user_table.txt作為輸出文件名稱。

在上面的pre_deal.sh代碼的處理邏輯部分,srand()用于生成隨機(jī)數(shù)的種子,id是我們?yōu)閿?shù)據(jù)集新增的一個字段,它是一個自增類型,每條記錄增加1,這樣可以保證每條記錄具有唯一性。我們會為數(shù)據(jù)集新增一個省份字段,用來進(jìn)行后面的數(shù)據(jù)可視化分析,為了給每條記錄增加一個省份字段的值,這里,我們首先用Province[]數(shù)組用來保存全國各個省份信息,然后,在遍歷數(shù)據(jù)集raw_user.csv的時候,每當(dāng)遍歷到其中一條記錄,使用value=int(rand()*34)語句隨機(jī)生成一個0-33的整數(shù),作為Province省份值,然后從Province[]數(shù)組當(dāng)中獲取省份名稱,增加到該條記錄中。

substr($6,1,10)這個語句是為了截取時間字段time的年月日,方便后續(xù)存儲為date格式。awk每次遍歷到一條記錄時,每條記錄包含了6個字段,其中,第6個字段是時間字段,substr($6,1,10)語句就表示獲取第6個字段的值,截取前10個字符,第6個字段是類似”2014-12-08 18″這樣的字符串(也就是表示2014年12月8日18時),substr($6,1,10)截取后,就丟棄了小時,只保留了年月日。
另外,在

print id”\t”\$1\t”\$2\t”\$3\t”\$5\t”substr(\$6,1,10)\t”Province[value]

這行語句中,我們丟棄了每行記錄的第4個字段,所以,沒有出現(xiàn)$4。我們生成后的文件是“\t”進(jìn)行分割,這樣,后續(xù)我們?nèi)ゲ榭磾?shù)據(jù)的時候,效果讓人看上去更舒服,每個字段在排版的時候會對齊顯示,如果用逗號分隔,顯示效果就比較亂。

最后,保存pre_deal.sh代碼文件,退出vim編輯器。
下面就可以執(zhí)行pre_deal.sh腳本文件,來對raw_user.csv進(jìn)行數(shù)據(jù)預(yù)處理,命令如下:

cd /usr/local/bigdatacase/dataset
bash ./pre_deal.sh small_user.csv user_table.txt  

可以使用head命令查看生成的user_table.txt,不要直接打開,文件過大,會出錯,下面查看前10行數(shù)據(jù):
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

(3)導(dǎo)入數(shù)據(jù)庫

下面要把user_table.txt中的數(shù)據(jù)最終導(dǎo)入到數(shù)據(jù)倉庫Hive中。為了完成這個操作,我們會首先把user_table.txt上傳到分布式文件系統(tǒng)HDFS中,然后,在Hive中創(chuàng)建一個外部表,完成數(shù)據(jù)的導(dǎo)入。

  • a.啟動HDFS
    HDFS是Hadoop的核心組件,因此,需要使用HDFS,必須安裝Hadoop。這里假設(shè)你已經(jīng)安裝了Hadoop,安裝目錄是“/usr/local/hadoop”。
    下面,請登錄Linux系統(tǒng),打開一個終端,執(zhí)行下面命令啟動Hadoop:
cd /usr/local/hadoop
./sbin/start-all.sh

然后,執(zhí)行jps命令看一下當(dāng)前運(yùn)行的進(jìn)程:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
說明hadoop啟動成功。

  • b.把user_table.txt上傳到HDFS中
    現(xiàn)在,我們要把Linux本地文件系統(tǒng)中的user_table.txt上傳到分布式文件系統(tǒng)HDFS中,存放在HDFS中的“/bigdatacase/dataset”目錄下。
    首先,請執(zhí)行下面命令,在HDFS的根目錄下面創(chuàng)建一個新的目錄bigdatacase,并在這個目錄下創(chuàng)建一個子目錄dataset,如下:
cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /bigdatacase/dataset

然后,把Linux本地文件系統(tǒng)中的user_table.txt上傳到分布式文件系統(tǒng)HDFS的“/bigdatacase/dataset”目錄下,命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset

下面可以查看一下HDFS中的user_table.txt的前10條記錄,命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs -cat /bigdatacase/dataset/user_table.txt | head -10

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

  • c.在Hive上創(chuàng)建數(shù)據(jù)庫
    這里假設(shè)你已經(jīng)完成了Hive的安裝,并且使用MySQL數(shù)據(jù)庫保存Hive的元數(shù)據(jù)。本教程安裝的是Hive2.1.0版本,安裝目錄是“/usr/local/hive”。
    下面,請在Linux系統(tǒng)中,再新建一個終端。因為需要借助于MySQL保存Hive的元數(shù)據(jù),所以,請首先啟動MySQL數(shù)據(jù)庫:
sudo service mysql start  //可以在Linux的任何目錄下執(zhí)行該命令

由于Hive是基于Hadoop的數(shù)據(jù)倉庫,使用HiveQL語言撰寫的查詢語句,最終都會被Hive自動解析成MapReduce任務(wù)由Hadoop去具體執(zhí)行,因此,需要啟動Hadoop,然后再啟動Hive。由于前面我們已經(jīng)啟動了Hadoop,所以,這里不需要再次啟動Hadoop。下面,在這個新的終端中執(zhí)行下面命令進(jìn)入Hive:

cd /usr/local/hive
./bin/hive   //啟動Hive

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
下面,我們要在Hive中創(chuàng)建一個數(shù)據(jù)庫dblab,命令如下:

hive>  create database dblab;
hive>  use dblab;
  • d.創(chuàng)建外部表
    這里我們要在數(shù)據(jù)庫dblab中創(chuàng)建一個外部表bigdata_user,它包含字段(id, uid, item_id, behavior_type, item_category, date, province),請在hive命令提示符下輸入如下命令:
hive>  CREATE EXTERNAL TABLE dblab.bigdata_user(id INT,uid STRING,item_id STRING,behavior_type INT,item_category STRING,visit_date DATE,province STRING) COMMENT 'Welcome to xmu dblab!' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/bigdatacase/dataset';
  • e.查詢數(shù)據(jù)
    上面已經(jīng)成功把HDFS中的“/bigdatacase/dataset”目錄下的數(shù)據(jù)加載到了數(shù)據(jù)倉庫Hive中,我們現(xiàn)在可以使用下面命令查詢一下:
hive>  select * from bigdata_user limit 10;
hive>  select behavior_type from bigdata_user limit 10;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3 Hive數(shù)據(jù)分析

3.1 操作Hive

在“hive>”命令提示符狀態(tài)下執(zhí)行下面命令:

hive> use dblab; //使用dblab數(shù)據(jù)庫
hive> show tables; //顯示數(shù)據(jù)庫中所有表。
hive> show create table bigdata_user; //查看bigdata_user表的各種屬性;

執(zhí)行結(jié)果如下:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
可以執(zhí)行下面命令查看表的簡單結(jié)構(gòu):

hive> desc bigdata_user;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3.2 簡單查詢分析

先測試一下簡單的指令:

hive> select behavior_type from bigdata_user limit 10;//查看前10位用戶對商品的行為

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
如果要查出每位用戶購買商品時的多種信息,輸出語句格式為 select 列1,列2,….,列n from 表名;
比如我們現(xiàn)在查詢前20位用戶購買商品時的時間和商品的種類

hive> select visit_date,item_category from bigdata_user limit 20;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
有時我們在表中查詢可以利用嵌套語句,如果列名太復(fù)雜可以設(shè)置該列的別名,以簡化我們操作的難度,以下我們可以舉個例子:

hive> select e.bh, e.it  from (select behavior_type as bh, item_category as it from bigdata_user) as e  limit 20;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
這里簡單的做個講解,behavior_type as bh ,item_category as it就是把behavior_type 設(shè)置別名 bh ,item_category 設(shè)置別名 it,F(xiàn)ROM的括號里的內(nèi)容我們也設(shè)置了別名e,這樣調(diào)用時用e.bh,e.it,可以簡化代碼。

3.3 查詢條數(shù)統(tǒng)計分析

經(jīng)過簡單的查詢后我們同樣也可以在select后加入更多的條件對表進(jìn)行查詢,下面可以用函數(shù)來查找我們想要的內(nèi)容。
(1)用聚合函數(shù)count()計算出表內(nèi)有多少條行數(shù)據(jù)

hive> select count(*) from bigdata_user;//用聚合函數(shù)count()計算出表內(nèi)有多少條行數(shù)據(jù) 

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
(2)在函數(shù)內(nèi)部加上distinct,查出uid不重復(fù)的數(shù)據(jù)有多少條
下面繼續(xù)執(zhí)行操作:

hive> select count(distinct uid) from bigdata_user;//在函數(shù)內(nèi)部加上distinct,查出uid不重復(fù)的數(shù)據(jù)有多少條

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
(3)查詢不重復(fù)的數(shù)據(jù)有多少條(為了排除客戶刷單情況)

hive>select count(*) from (select uid,item_id,behavior_type,item_category,visit_date,province from bigdata_user group by uid,item_id,behavior_type,item_category,visit_date,province having count(*)=1)a;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3.4 關(guān)鍵字條件查詢分析

3.4.1 以關(guān)鍵字的存在區(qū)間為條件的查詢

使用where可以縮小查詢分析的范圍和精確度,下面用實(shí)例來測試一下。
(1)查詢2014年12月10日到2014年12月13日有多少人瀏覽了商品

hive>select count(*) from bigdata_user where behavior_type='1' and visit_date<'2014-12-13' and visit_date>'2014-12-10';

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
(2)以月的第n天為統(tǒng)計單位,依次顯示第n天網(wǎng)站賣出去的商品的個數(shù)

hive> select count(distinct uid), day(visit_date) from bigdata_user where behavior_type='4' group by day(visit_date);

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3.4.2 關(guān)鍵字賦予給定值為條件,對其他數(shù)據(jù)進(jìn)行分析

取給定時間和給定地點(diǎn),求當(dāng)天發(fā)出到該地點(diǎn)的貨物的數(shù)量

hive> select count(*) from bigdata_user where province='江西' and visit_date='2014-12-12' and behavior_type='4';

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3.5 根據(jù)用戶行為分析

原始數(shù)據(jù)集過大,一下實(shí)驗均使用small_dataset。

3.5.1 查詢一件商品在某天的購買比例或瀏覽比例
hive> select count(*) from bigdata_user where visit_date='2014-12-11'and behavior_type='4';//查詢有多少用戶在2014-12-11購買了商品

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

hive> select count(*) from bigdata_user where visit_date ='2014-12-11';//查詢有多少用戶在2014-12-11點(diǎn)擊了該店

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
根據(jù)上面語句得到購買數(shù)量和點(diǎn)擊數(shù)量,兩個數(shù)相除即可得出當(dāng)天該商品的購買率。

3.5.2 查詢某個用戶在某一天點(diǎn)擊網(wǎng)站占該天所有點(diǎn)擊行為的比例(點(diǎn)擊行為包括瀏覽,加入購物車,收藏,購買)
hive> select count(*) from bigdata_user where uid=10001082 and visit_date='2014-12-12';//查詢用戶10001082在2014-12-12點(diǎn)擊網(wǎng)站的次數(shù)

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

hive> select count(*) from bigdata_user where visit_date='2014-12-12';//查詢所有用戶在這一天點(diǎn)擊該網(wǎng)站的次數(shù)

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
上面兩條語句的結(jié)果相除,就得到了要要求的比例。

3.5.3 給定購買商品的數(shù)量范圍,查詢某一天在該網(wǎng)站的購買該數(shù)量商品的用戶id
hive> select uid from bigdata_user where behavior_type='4' and visit_date='2014-12-12' group by uid having count(behavior_type='4')>5;//查詢某一天在該網(wǎng)站購買商品超過5次的用戶id

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

3.6 用戶實(shí)時查詢分析

某個地區(qū)的用戶當(dāng)天瀏覽網(wǎng)站的次數(shù)

hive> create table scan(province STRING,scan INT) COMMENT 'This is the search of bigdataday' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;//創(chuàng)建新的數(shù)據(jù)表進(jìn)行存儲
hive> insert overwrite table scan select province,count(behavior_type) from bigdata_user where behavior_type='1' group by province;//導(dǎo)入數(shù)據(jù)
hive> select * from scan;//顯示結(jié)果

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

4 Hive、MySQL、HBase數(shù)據(jù)互導(dǎo)

4.1 準(zhǔn)備工作

本教程需要安裝Hive、MySQL、HBase。在前面的第一個步驟中,我們在安裝Hive的時候就已經(jīng)一起安裝了MySQL(因為我們采用MySQL來存儲Hive的元數(shù)據(jù)),所以,現(xiàn)在你只需要再安裝HBase。
Hive預(yù)操作
如果你還沒有啟動Hive,請首先啟動Hive。
請登錄Linux系統(tǒng)(本教程統(tǒng)一采用hadoop用戶名登錄系統(tǒng)),然后,打開一個終端。
本教程中,Hadoop的安裝目錄是“/usr/local/hadoop”,Hive的安裝目錄是“/usr/local/hive”。
因為需要借助于MySQL保存Hive的元數(shù)據(jù),所以,請首先啟動MySQL數(shù)據(jù)庫,請在終端中輸入下面命令:

service mysql start  //可以在Linux的任何目錄下執(zhí)行該命令

由于Hive是基于Hadoop的數(shù)據(jù)倉庫,使用HiveQL語言撰寫的查詢語句,最終都會被Hive自動解析成MapReduce任務(wù)由Hadoop去具體執(zhí)行,因此,需要啟動Hadoop,然后再啟動Hive。
下面,繼續(xù)執(zhí)行下面命令啟動進(jìn)入Hive:

cd /usr/local/hive
./bin/hive   //啟動Hive

然后,在“hive>”命令提示符狀態(tài)下執(zhí)行下面命令:
1、創(chuàng)建臨時表user_action

hive> create table dblab.user_action(id STRING,uid STRING, item_id STRING, behavior_type STRING, item_category STRING, visit_date DATE, province STRING) COMMENT 'Welcome to XMU dblab! ' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;

這個命令執(zhí)行完以后,Hive會自動在HDFS文件系統(tǒng)中創(chuàng)建對應(yīng)的數(shù)據(jù)文件。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
2、將bigdata_user表中的數(shù)據(jù)插入到user_action(執(zhí)行時間:10秒左右)
在第二個步驟——Hive數(shù)據(jù)分析中,我們已經(jīng)在Hive中的dblab數(shù)據(jù)庫中創(chuàng)建了一個外部表bigdata_user。下面把dblab.bigdata_user數(shù)據(jù)插入到dblab.user_action表中,命令如下:

hive> INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user;

請執(zhí)行下面命令查詢上面的插入命令是否成功執(zhí)行:

hive>select * from user_action limit 10;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

4.2 使用Java API將數(shù)據(jù)從Hive導(dǎo)入MySQL

1、啟動Hadoop集群、MySQL服務(wù)
前面我們已經(jīng)啟動了Hadoop集群和MySQL服務(wù)。這里請確認(rèn)已經(jīng)按照前面操作啟動成功。
2、將前面生成的臨時表數(shù)據(jù)從Hive導(dǎo)入到 MySQL 中,包含如下四個步驟。
(1)登錄 MySQL
請在Linux系統(tǒng)中新建一個終端,執(zhí)行下面命令:

sudo mysql –u root –p 

為了簡化操作,本教程直接使用root用戶登錄MySQL數(shù)據(jù)庫,但是,在實(shí)際應(yīng)用中,建議在MySQL中再另外創(chuàng)建一個用戶。
執(zhí)行上面命令以后,就進(jìn)入了“mysql>”命令提示符狀態(tài)。
(2)創(chuàng)建數(shù)據(jù)庫

mysql> show databases; #顯示所有數(shù)據(jù)庫
mysql> create database dblab; #創(chuàng)建dblab數(shù)據(jù)庫
mysql> use dblab; #使用數(shù)據(jù)庫

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
請使用下面命令查看數(shù)據(jù)庫的編碼:

mysql>show variables like "char%";

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
請確認(rèn)當(dāng)前編碼為utf8,否則無法導(dǎo)入中文,請參考Ubuntu安裝MySQL及常用操作修改編碼http://dblab.xmu.edu.cn/blog/install-mysql/ 。
下面是筆者電腦上修改了編碼格式后的結(jié)果:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
(3)創(chuàng)建表
下面在MySQL的數(shù)據(jù)庫dblab中創(chuàng)建一個新表user_action,并設(shè)置其編碼為utf-8:

mysql> CREATE TABLE `dblab`.`user_action` (`id` varchar(50),`uid` varchar(50),`item_id` varchar(50),`behavior_type` varchar(10),`item_category` varchar(50), `visit_date` DATE,`province` varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

創(chuàng)建成功后,輸入下面命令退出MySQL:

mysql> exit

(4)導(dǎo)入數(shù)據(jù)(執(zhí)行時間:20秒左右)
通過JDBC連接Hive和MySQL ,將數(shù)據(jù)從Hive導(dǎo)入MySQL。通過JDBC連接Hive,需要通過Hive的thrift服務(wù)實(shí)現(xiàn)跨語言訪問Hive,實(shí)現(xiàn)thrift服務(wù)需要開啟hiveserver2。
在Hadoop的配置文件core-site.xml中添加以下配置信息:(目錄為/usr/local/hadoop/etc/hadoop/core-site.xml)

<property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
</property>
<property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
</property>

開啟hadoop以后,在目錄/usr/local/hive下執(zhí)行以下命令開啟hiveserver2,并設(shè)置默認(rèn)端口為10000。

cd /usr/local/hive
./bin/hive --service hiveserver2 -hiveconf hive.server2.thrift.port=10000

在出現(xiàn)了幾個Hive Session ID=…之后,出現(xiàn)ok,Hive才會真正啟動。
啟動成功后不要退出,新建一個服務(wù)器終端,使用如下命令查看10000號端口是否被占用。

sudo netstat -anp|grep 10000

如圖所示,端口10000已被占用,即hiveserver2啟動成功。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
在個人電腦使用IDEA新建一個maven project。在pom.xml添加以下依賴文件(可能會有多余的,但是無礙)。

  <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-metastore</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-common -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-common</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-cli -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-cli</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-contrib -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-contrib</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
    </dependencies>

在main–>java下新建java文件,命名為HivetoMySQL。內(nèi)容如下。

import java.sql.*;
import java.sql.SQLException;

public class HivetoMySQL {
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
    private static String driverName_mysql = "com.mysql.jdbc.Driver";
    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driverName);
        }catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.exit(1);
        }
        Connection con1 = DriverManager.getConnection("jdbc:hive2://101.***.***.168:10000/default", "hive", "hive");//101.***.***.168為你自己的服務(wù)器ip地址,后兩個參數(shù)是用戶名密碼

        if(con1 == null)
            System.out.println("連接失敗");
        else {
            Statement stmt = con1.createStatement();
            String sql = "select * from dblab.user_action";
            System.out.println("Running: " + sql);
            ResultSet res = stmt.executeQuery(sql);

            //InsertToMysql
            try {
                System.out.println("begin try");
                Class.forName(driverName_mysql);
                Connection con2 = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dblab","root","********");//********為root密碼
                String sql2 = "insert into user_action(id,uid,item_id,behavior_type,item_category,visit_date,province) values (?,?,?,?,?,?,?)";
                PreparedStatement ps = con2.prepareStatement(sql2);
                while (res.next()) {
                    ps.setString(1,res.getString(1));
                    ps.setString(2,res.getString(2));
                    ps.setString(3,res.getString(3));
                    ps.setString(4,res.getString(4));
                    ps.setString(5,res.getString(5));
                    ps.setDate(6,res.getDate(6));
                    ps.setString(7,res.getString(7));
                    ps.executeUpdate();
                }
                ps.close();
                con2.close();
                res.close();
                stmt.close();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        con1.close();
    }
}

使用IDEA的ssh遠(yuǎn)程調(diào)試服務(wù)。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
上面程序執(zhí)行完畢后,在MySQL中進(jìn)行查詢。

select count(*) from user_action;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

4.3 查看MySQL中user_action表數(shù)據(jù)

下面需要再次啟動MySQL,進(jìn)入“mysql>”命令提示符狀態(tài):

mysql -u root -p

然后執(zhí)行下面命令查詢user_action表中的數(shù)據(jù):

mysql> use dblab;
mysql> select * from user_action limit 10;

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
至此,數(shù)據(jù)從Hive導(dǎo)入MySQL的操作順利完成。

4.4 使用HBase Java API把數(shù)據(jù)從本地導(dǎo)入HBase中

4.4.1 啟動Hadoop集群、HBase服務(wù)

確保啟動了hadoop集群和HBase服務(wù)。如果沒有啟動就在Linux系統(tǒng)中打開一個終端。輸入以下命令。

cd /usr/local/hadoop
./sbin/start-all.sh
cd /usr/local/hbase
./bin/start-hbase.sh
4.4.2 數(shù)據(jù)準(zhǔn)備

實(shí)際上,也可以編寫java程序,直接從HDFS中讀取數(shù)據(jù)加載到HBase。但是,這里展示的是如何用Java程序把數(shù)據(jù)從本地導(dǎo)入HBase中。只要對程序做簡單修改,就可以實(shí)現(xiàn)從HDFS中讀取數(shù)據(jù)加載到HBase。
將之前的user_action數(shù)據(jù)從HDFS復(fù)制到Linux系統(tǒng)的本地文件系統(tǒng)中,命令如下:

cd /usr/local/bigdatacase/dataset
/usr/local/hadoop/bin/hdfs dfs -get /user/hive/warehouse/dblab.db/user_action .
 #將HDFS上的user_action數(shù)據(jù)復(fù)制到本地當(dāng)前目錄,注意'.'表示當(dāng)前目錄
cat ./user_action/* | head -10   #查看前10行數(shù)據(jù)
cat ./user_action/00000* > user_action.output #將00000*文件復(fù)制一份重命名為user_action.output,*表示通配符
head user_action.output  #查看user_action.output前10行

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

4.4.3 編寫數(shù)據(jù)導(dǎo)入程序

這里采用IDEA編寫Java程序?qū)崿F(xiàn)HBase導(dǎo)入功能,具體代碼如下:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List; 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes; 
public class ImportHBase extends Thread {
    public Configuration config;
    public Connection conn;
    public Table table;
    public Admin admin;
    public ImportHBase() {
        config = HBaseConfiguration.create();
//      config.set("hbase.master", "master:60000");
//      config.set("hbase.zookeeper.quorum", "master");
        try {
            conn = ConnectionFactory.createConnection(config);
            admin = conn.getAdmin();
            table = conn.getTable(TableName.valueOf("user_action"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {       //第一個參數(shù)是該jar所使用的類,第二個參數(shù)是數(shù)據(jù)集所存放的路徑
            throw new Exception("You must set input path!");
        }
        String fileName = args[args.length-1];  //輸入的文件路徑是最后一個參數(shù)
        ImportHBase test = new ImportHBase();
        test.importLocalFileToHBase(fileName);
    }
    public void importLocalFileToHBase(String fileName) {
        long st = System.currentTimeMillis();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(
                    fileName)));
            String line = null;
            int count = 0;
            while ((line = br.readLine()) != null) {
                count++;
                put(line);
                if (count % 10000 == 0)
                    System.out.println(count);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally { 
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                table.close(); // must close the client
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        long en2 = System.currentTimeMillis();
        System.out.println("Total Time: " + (en2 - st) + " ms");
    }
    @SuppressWarnings("deprecation")
    public void put(String line) throws IOException {
        String[] arr = line.split("\t", -1);
        String[] column = {"id","uid","item_id","behavior_type","item_category","date","province"};
 
        if (arr.length == 7) {
            Put put = new Put(Bytes.toBytes(arr[0]));// rowkey
            for(int i=1;i<arr.length;i++){
                put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes(column[i]),Bytes.toBytes(arr[i]));
            }
            table.put(put); // put to server
        }
    }
    public void get(String rowkey, String columnFamily, String column,
            int versions) throws IOException {
        long st = System.currentTimeMillis();
        Get get = new Get(Bytes.toBytes(rowkey));
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
        Scan scanner = new Scan(get);
        scanner.readVersions(versions);
        ResultScanner rsScanner = table.getScanner(scanner);
        for (Result result : rsScanner) {
            final List<Cell> list = result.listCells();
            for (final Cell kv : list) {
                System.out.println(Bytes.toStringBinary(kv.getValueArray()) + "\t"
                        + kv.getTimestamp()); // mid + time
            }
        }
        rsScanner.close();
        long en2 = System.currentTimeMillis();
        System.out.println("Total Time: " + (en2 - st) + " ms");
    }
}

打包之后發(fā)送至服務(wù)器,存放在/usr/local/bigdatacase/hbase(如果沒有需要新建)。

4.4.4 數(shù)據(jù)導(dǎo)入

在導(dǎo)入之前,先新建user_action表,新建HBase Shell窗口。

hbase shell(在任意位置輸入命令)

啟動成功后,就進(jìn)入了“hbase>”命令提示符狀態(tài)。
創(chuàng)建表user_action

hbase> create 'user_action', { NAME => 'f1', VERSIONS => 5}

上面命令在HBase中創(chuàng)建了一個user_action表,這個表中有一個列族f1(你愿意把列族名稱取為其他名稱也可以,比如列族名稱為userinfo),歷史版本保留數(shù)量為5。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
下面就可以運(yùn)行hadoop jar命令運(yùn)行程序:

/usr/local/hadoop/bin/hadoop jar /usr/local/bigdatacase/hbase/ImportHBase.jar HBaseImportTest /usr/local/bigdatacase/dataset/user_action.output

這個命令大概會執(zhí)行幾分鐘左右,執(zhí)行過程中,屏幕上會打印出執(zhí)行進(jìn)度,每執(zhí)行1萬條,對打印出一行信息,所以,整個執(zhí)行過程屏幕上顯示如下信息:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
查看HBase中user_action表數(shù)據(jù)
下面,再次切換到HBase Shell窗口,執(zhí)行下面命令查詢數(shù)據(jù):

habse> scan 'user_action',{LIMIT=>10}  #只查詢前面10行

就可以得到類似下面的查詢結(jié)果了:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析

5 利用R進(jìn)行數(shù)據(jù)可視化分析

5.1 安裝R

Ubuntu自帶的APT包管理器中的R安裝包總是落后于標(biāo)準(zhǔn)版,因此需要添加新的鏡像源把APT包管理中的R安裝包更新到最新版。
請登錄Linux系統(tǒng),打開一個終端,然后執(zhí)行下面命令(并注意保持網(wǎng)絡(luò)連通,可以訪問互聯(lián)網(wǎng),因為安裝過程要下載各種安裝文件):
利用vim打開/etc/apt/sources.list文件

sudo vim /etc/apt/sources.list

在文件中添加阿里云的鏡像源,把如下文件添加進(jìn)去。其中xenial是Ubuntu16.04的代號。

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

退出vim,更新軟件源列表

sudo apt-get update

安裝R語言

sudo apt-get install r-base

會提示“您希望繼續(xù)執(zhí)行嗎?[Y/n]”,可以直接鍵盤輸入“Y”,就可以順利安裝結(jié)束。
安裝結(jié)束后,可以執(zhí)行下面命令啟動R:

R

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
“>”就是R的命令提示符,你可以在后面輸入R語言命令。
可以執(zhí)行下面命令退出R:

>q()

安裝依賴庫
為了完成可視化功能,我們需要為R安裝一些依賴庫,包括:RMySQL、ggplot2、devtools和recharts。
RMySQL是一個提供了訪問MySQL數(shù)據(jù)庫的R語言接口程序的R語言依賴庫。
ggplot2和recharts則是R語言中提供繪圖可視化功能的依賴庫。
請啟動R進(jìn)入R命令提示符狀態(tài),執(zhí)行如下命令安裝RMySQL:

> install.packages('RMySQL')

執(zhí)行如下命令安裝繪圖包ggplot2:

install.packages('ggplot2')

安裝devtools

install.packages('devtools')

筆者在Ubuntu16.04上執(zhí)行devtools安裝時,出現(xiàn)了錯誤,筆者根據(jù)每次錯誤的英文提示信息,安裝了三個軟件libssl-dev、libssh2-1-dev、libcurl4-openssl-dev,安裝命令如下:

sudo apt-get install libssl-dev
sudo apt-get install libssh2-1-dev
sudo apt-get install libcurl4-openssl-dev

安裝之后重新安裝devtools。
下面在R命令提示符下再執(zhí)行如下命令安裝taiyun/recharts:

> devtools::install_github('taiyun/recharts')

大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
至此,工具安裝已全部完成。

5.2 可視化分析

以下分析使用的函數(shù)方法,都可以使用如下命令查詢函數(shù)的相關(guān)文檔。例如:查詢sort()函數(shù)如何使用

?sort

這時,就會進(jìn)入冒號“:”提示符狀態(tài)(也就是幫助文檔狀態(tài)),在冒號后面輸入q即可退出幫助文檔狀態(tài),返回到R提示符狀態(tài)!
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
連接MySQL,并獲取數(shù)據(jù)
請在Linux系統(tǒng)中新建另外一個終端,然后執(zhí)行下面命令啟動MySQL數(shù)據(jù)庫:

sudo service mysql start

下面,讓我們查看一下MySQL數(shù)據(jù)庫中的數(shù)據(jù),請執(zhí)行下面命令進(jìn)入MySQL命令提示符狀態(tài):

mysql -u root -p

會提示你輸入密碼,就進(jìn)入了“mysql>”提示符狀態(tài),下面就可以輸入一些SQL語句查詢數(shù)據(jù):

mysql> use dblab;
mysql> select * from user_action limit 10;

這樣,就可以查看到數(shù)據(jù)庫dblab中的user_action表的前10行記錄,如下:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
然后切換到剛才已經(jīng)打開的R命令提示符終端窗口:

library(RMySQL)
conn <- dbConnect(MySQL(),dbname='dblab',username='root',password='hadoop',host="127.0.0.1",port=3306)
user_action <- dbGetQuery(conn,'select * from user_action')

分析消費(fèi)者對商品的行為

summary(user_action$behavior_type)

summary() 函數(shù)可以得到樣本數(shù)據(jù)類型和長度,如果樣本是數(shù)值型,我們還能得到樣本數(shù)據(jù)的最小值、最大值、四分位數(shù)以及均值信息。
得到結(jié)果:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
可以看出原來的MySQL數(shù)據(jù)中,消費(fèi)者行為變量的類型是字符型。這樣不好做比較,需要把消費(fèi)者行為變量轉(zhuǎn)換為數(shù)值型變量

summary(as.numeric(user_action$behavior_type))

得到結(jié)果:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
接下來用柱狀圖表示:

library(ggplot2)
ggplot(user_action,aes(as.numeric(behavior_type)))+geom_histogram()

在使用ggplot2庫的時候,需要使用library導(dǎo)入庫。ggplot()繪制時,創(chuàng)建繪圖對象,即第一個圖層,包含兩個參數(shù)(數(shù)據(jù)與變量名稱映射).變量名稱需要被包含aes函數(shù)里面。ggplot2的圖層與圖層之間用“+”進(jìn)行連接。ggplot2包中的geom_histogram()可以很方便的實(shí)現(xiàn)直方圖的繪制。
由于我們使用ssh遠(yuǎn)程調(diào)試,無法得到圖形界面,所以要增加存儲圖片的步驟。然后傳到個人電腦中查看。命令如下:

> setwd('/usr/local/rpictures') #選取儲存目錄,建議和R工作表分開
> future=paste("fig1",".jpg") #通過paste將文件名和后綴連接起來
> jpeg(file=future)
> ggplot(user_action,aes(as.numeric(behavior_type)))+geom_histogram()
> dev.off()

分析結(jié)果如下圖:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
從上圖可以得到:大部分消費(fèi)者行為僅僅只是瀏覽。只有很少部分的消費(fèi)者會購買商品。
分析哪一類商品被購買總量前十的商品和被購買總量

temp <- subset(user_action,as.numeric(behavior_type)==4) # 獲取子數(shù)據(jù)集
count <- sort(table(temp$item_category),decreasing = T) #排序
print(count[1:10]) # 獲取第1到10個排序結(jié)果

subset()函數(shù),從某一個數(shù)據(jù)框中選擇出符合某條件的數(shù)據(jù)或是相關(guān)的列.table()對應(yīng)的就是統(tǒng)計學(xué)中的列聯(lián)表,是一種記錄頻數(shù)的方法.sort()進(jìn)行排序,返回排序后的數(shù)值向量。
得到結(jié)果:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
結(jié)果第一行表示商品分類,該類下被消費(fèi)的數(shù)次。
接下來用散點(diǎn)圖表示:

> result <- as.data.frame(count[1:10]) #將count矩陣結(jié)果轉(zhuǎn)換成數(shù)據(jù)框
> setwd('/usr/local/rpictures') #選取儲存目錄,建議和R工作表分開
> future=paste("fig2",".jpg") #通過paste將文件名和后綴連接起來
> jpeg(file=future)
> ggplot(result,aes(Var1,Freq,col=factor(Var1)))+geom_point()
> dev.off()

通過 as.data.frame() 把矩陣等轉(zhuǎn)換成為數(shù)據(jù)框.
分析結(jié)果如下圖:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
分析每年的哪個月份購買商品的量最多
從MySQL直接獲取的數(shù)據(jù)中visit_date變量都是2014年份,并沒有劃分出具體的月份,那么可以在數(shù)據(jù)集增加一列月份數(shù)據(jù)。

month <- substr(user_action$visit_date,6,7) # visit_date變量中截取月份
user_action <- cbind(user_action,month) # user_action增加一列月份數(shù)據(jù)

接下來用柱狀圖分別表示消費(fèi)者購買量

ggplot(user_action,aes(as.numeric(behavior_type),col=factor(month)))+geom_histogram()+facet_grid(.~month)

aes()函數(shù)中的col屬性可以用來設(shè)置顏色。factor()函數(shù)則是把數(shù)值變量轉(zhuǎn)換成分類變量,作用是以不同的顏色表示。如果不使用factor()函數(shù),顏色將以同一種顏色漸變的顏色表現(xiàn)。 facet_grid(.~month)表示柱狀圖按照不同月份進(jìn)行分區(qū)。
由于MySQL獲取的數(shù)據(jù)中只有11月份和12月份的數(shù)據(jù),所以上圖只有顯示兩個表格。
分析結(jié)果如下圖:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
分析國內(nèi)哪個省份的消費(fèi)者最有購買欲望

library(recharts)
rel <- as.data.frame(table(temp$province))
provinces <- rel$Var1
x = c()
for(n in provinces){
x[length(x)+1] = nrow(subset(temp,(province==n)))
}
mapData <- data.frame(province=rel$Var1,
count=x, stringsAsFactors=F) # 設(shè)置地圖信息
eMap(mapData, namevar=~province, datavar = ~count) #畫出中國地圖

nrow()用來計算數(shù)據(jù)集的行數(shù)。
可能會出現(xiàn)無法顯示數(shù)字的問題,如下所示。
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析
這是因為R語言讀取sql數(shù)據(jù)時,讀入中文出現(xiàn)亂碼,所以無法正確識別省份。于是需要讀取時先在R里對數(shù)據(jù)庫中文編碼進(jìn)行如下設(shè)置。

dbSendQuery(conn,'SET NAMES gbk')   #設(shè)置格式為Gbk

分析結(jié)果如下圖:
大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析文章來源地址http://www.zghlxwxcb.cn/news/detail-455800.html

到了這里,關(guān)于大數(shù)據(jù)課程綜合實(shí)驗案例:網(wǎng)站用戶行為分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)倉用戶行為數(shù)據(jù)分析

    分層優(yōu)點(diǎn):復(fù)雜的東西可以簡單化、解耦(屏蔽層作用)、提高復(fù)用、方便管理 SA 貼源? 數(shù)據(jù)組織結(jié)構(gòu)與源系統(tǒng)保持一致 shm 歷史層? 針對不同特征的數(shù)據(jù)做不同算法,目的都是為了得到一份完整的數(shù)據(jù) PDM 明細(xì)層 做最細(xì)粒度的數(shù)據(jù)明細(xì),最高擴(kuò)展性和靈活性,企業(yè)級的數(shù)據(jù)

    2024年02月08日
    瀏覽(21)
  • 大數(shù)據(jù)畢設(shè)項目 - 大數(shù)據(jù)電商用戶行為分析 -python 大數(shù)據(jù)

    大數(shù)據(jù)畢設(shè)項目 - 大數(shù)據(jù)電商用戶行為分析 -python 大數(shù)據(jù)

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年03月17日
    瀏覽(28)
  • 廣電用戶畫像分析之根據(jù)用戶行為數(shù)據(jù)進(jìn)行篩選與標(biāo)簽添加

    廣電用戶畫像分析之根據(jù)用戶行為數(shù)據(jù)進(jìn)行篩選與標(biāo)簽添加

    在數(shù)據(jù)處理和分析領(lǐng)域,我們經(jīng)常需要根據(jù)用戶的行為數(shù)據(jù)進(jìn)行篩選和標(biāo)簽添加,以便更好地理解用戶行為和偏好。在本篇博客中,我們將介紹兩個示例,展示如何根據(jù)用戶的收視行為數(shù)據(jù)和訂單信息進(jìn)行數(shù)據(jù)處理和分析。 數(shù)據(jù)集分析: 廣電用戶畫像分析之探索各個表中的

    2024年02月11日
    瀏覽(18)
  • 大數(shù)據(jù)實(shí)戰(zhàn) --- 淘寶用戶行為數(shù)據(jù)分析

    大數(shù)據(jù)實(shí)戰(zhàn) --- 淘寶用戶行為數(shù)據(jù)分析

    目錄 開發(fā)環(huán)境? 數(shù)據(jù)描述 功能需求 數(shù)據(jù)準(zhǔn)備 數(shù)據(jù)清洗 用戶行為分析 找出有價值的用戶 Hadoop+Hive+Spark+HBase 啟動Hadoop :start-all.sh 啟動zookeeper :zkServer.sh start 啟動Hive : nohup hiveserver2 1/dev/null 21 beeline -u jdbc:hive2://192.168.152.192:10000 啟動Hbase : start-hbase.sh hbase shell 啟動Spark :s

    2023年04月22日
    瀏覽(34)
  • 電商技術(shù)揭秘十五:數(shù)據(jù)挖掘與用戶行為分析

    電商技術(shù)揭秘十五:數(shù)據(jù)挖掘與用戶行為分析

    相關(guān)系列文章 電商技術(shù)揭秘一:電商架構(gòu)設(shè)計與核心技術(shù) 電商技術(shù)揭秘二:電商平臺推薦系統(tǒng)的實(shí)現(xiàn)與優(yōu)化 電商技術(shù)揭秘三:電商平臺的支付與結(jié)算系統(tǒng) 電商技術(shù)揭秘四:電商平臺的物流管理系統(tǒng) 電商技術(shù)揭秘五:電商平臺的個性化營銷與數(shù)據(jù)分析 電商技術(shù)揭秘六:前端

    2024年04月13日
    瀏覽(22)
  • Python大數(shù)據(jù)-對淘寶用戶的行為數(shù)據(jù)分析

    Python大數(shù)據(jù)-對淘寶用戶的行為數(shù)據(jù)分析

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import os data.shape[0] 總流量為12256906,在計算一下 日平均流量、日平均獨(dú)立訪客數(shù) ##日PV pv_daily = data.groupby([‘date’])[‘user_id’].count().reset_index().rename(columns={‘user_id’:‘pv_daily’}) pv_daily.head() 日平均獨(dú)立訪客數(shù)與日平均流

    2024年04月25日
    瀏覽(25)
  • 【數(shù)據(jù)分析項目實(shí)戰(zhàn)】篇1:游戲數(shù)據(jù)分析——新增、付費(fèi)和用戶行為評估

    目錄 0 結(jié)論 1 背景介紹 1.1 游戲介紹 1.2 數(shù)據(jù)集介紹 2 分析思路 3 新增用戶分析 3.1 新增用戶數(shù): 3.2 每日新增用戶數(shù): 3.3 分析 4 活躍度分析 4.1 用戶平均在線時長 4.2 付費(fèi)用戶平均在線時長 4.3 日活躍用戶(日平均在線時長10min)數(shù)及占比 4.4 分析與建議 5 游戲行為分析 5.1 對比

    2023年04月08日
    瀏覽(49)
  • 【產(chǎn)品運(yùn)營】如何通過數(shù)據(jù)分析掌握用戶行為?

    【產(chǎn)品運(yùn)營】如何通過數(shù)據(jù)分析掌握用戶行為?

    對于運(yùn)營來說,需要掌握用戶行為來制定不同的運(yùn)營策略。而用戶行為是通過數(shù)據(jù)分析得出的,那么,具體的數(shù)據(jù)分析是哪些數(shù)據(jù),不同的數(shù)據(jù)又有什么區(qū)別? 快速了解一款A(yù)PP。 行業(yè)趨勢,市場空間。 APP的生存現(xiàn)狀,所處階段,遇到的問題。 產(chǎn)品迭代,發(fā)現(xiàn)新的增長引擎方

    2024年02月11日
    瀏覽(23)
  • 社交媒體數(shù)據(jù)分析:解讀Facebook用戶行為

    社交媒體數(shù)據(jù)分析:解讀Facebook用戶行為

    在當(dāng)今數(shù)字化時代,社交媒體已經(jīng)成為人們生活不可或缺的一部分,而Facebook作為這個領(lǐng)域的巨頭,承載了數(shù)十億用戶的社交活動。這龐大的用戶群體產(chǎn)生了海量的數(shù)據(jù),通過深度數(shù)據(jù)分析,我們能夠深入解讀用戶行為,從而更好地滿足用戶需求、提升用戶體驗,同時為平臺

    2024年01月21日
    瀏覽(26)
  • 天池賽:淘寶用戶購物行為數(shù)據(jù)可視化分析

    天池賽:淘寶用戶購物行為數(shù)據(jù)可視化分析

    目錄 前言 一、賽題介紹 二、數(shù)據(jù)清洗、特征構(gòu)建、特征可視化 1.數(shù)據(jù)缺失值及重復(fù)值處理 2.日期分離,PV及UV構(gòu)建 3.PV及UV可視化 4.用戶行為可視化 4.1 各個行為的面積圖(以UV為例) 4.2 各個行為的熱力圖 5.轉(zhuǎn)化率可視化 三、RFM模型 1.構(gòu)建R、F、M 2.RFM的數(shù)據(jù)統(tǒng)計分布 3.計算

    2024年01月22日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包