1.实验环境
(1)Linux:Ubuntu 16.04。
虚拟机镜像下载链接:https://pan.baidu.com/s/1i_B-2rAfPM53jf7Besi0tw
提取码:WZJM
(2)MySQL:5.7.16。
(3)Hadoop:2.7.1。
(4)HBase:1.1.5。
(5)Hive:1.2.1。
(6)Sqoop:1.4.6。
(7)R:4.1.2。
(8)Eclipse:3.8。
2.实验步骤概述
本案例共包含4个实验步骤。
(1)本地数据集上传到数据仓库Hive。
(2)Hive数据分析。
(3)Hive,MySQL、HBase数据互导。
(4)利用R进行数据可视化分析。
实验整体的流程如下:
将数据源抽取到HDFS存储;
通过Hive清洗、处理和计算原始数据;
HIve清洗处理后的结果,可以存入Hbase或者其它数据库中例如MySQL
2.1.本地数据集上传到数据仓库Hive
数据集的下载链接
链接:https://pan.baidu.com/s/1wsHq9BlbNb-291UWnDduJg
提取码:WZJM
登录Linux系统,并在Linux系统中打开浏览器火狐浏览器;然后在Linux系统的浏览器中下载user. zip到本地。,因为采用的是hadoop用户名登录了Linux系统,所以,下载后的文件会被浏览器默认保存到“/home/ hadoop/下载/”目录下面。
打开终端输入如下命令:
cd home/hadoop/下载
Ls
出现uer.zip后证明下载成功
下面需要把user. zip进行解压缩,首先建立一个用于运行的目录bigdatacase,执行以下命令:
cd /usr/local
ls
sudo mkdir bigdatacase#这里会提示你输入当前用户(本教程是hadoop用户名)的密码#下面给hadoop用户赋予针对bigdatacase目录的各种操作权限
sudo chown -R hadoop:hadoop ./bigdatacasecd bigdatacase#下面创建一个dataset目录,用于保存数据集
mkdir dataset#下面就可以解压缩user.zip文件cd ~ //表示进入hadoop用户的目录cd 下载
ls
unzip user.zip -d /usr/local/bigdatacase/datasetcd /usr/local/bigdatacase/dataset
ls
现在就可以看到在 dataset目录下有两个文件:raw_user,csv和 small_user.csv。执行下面命令取出前面5条记录看一下:
head -5 raw_user.csv
可以看出,每行记录都包含5个字段,数据集中的字段及其含义如下。
(1) user_id(用户id)。
(2) item_id(商品id)。
(3) behaviour_type(包括浏览﹑收藏,加购物车、购买,对应取值分别是1,2、3、4)。(4) user_geohash(用户地理位置哈希值,有些记录中没有这个字段值,所以后面会用脚本做数据预处理时把这个字段全部删除)。
(5) item_category(商品分类)。
(6) time(该记录产生时间)。
2.2.Hive数据分析
2.2.1.数据集的预处理
2.2.1.1.删除第一行文件的记录
cd /usr/local/bigdatacase/dataset#下面删除raw_user中的第1行
sed -i '1d' raw_user#上面的1d表示删除第1行,同理,3d表示删除第3行,nd表示删除第n行#下面删除small_user中的第1行
sed -i '1d' small_user#下面再用head命令去查看文件的前5行记录,就看不到字段名称这一行了
head -5 raw_user.csv
head -5 small_user.csv
2.2.1.2.对字段进行预处理
下面对数据集进行预处理,包括为每行记录增加一个id字段(让记录具有唯一性)、增加一个省份字段(用来后续进行可视化分析),并且丢弃user_geohash字段(后面分析不需要这个字段)。
下面要建一个脚本文件 pre_deal.sh,把这个脚本文件放在 dataset目录下﹐和数据集small_user.csv放在同一个目录下:
cd /usr/local/bigdatacase/dataset
vim pre_deal.sh
上面使用vim编辑器新建了一个pre_deal.sh脚本文件,在这个脚本文件下加入下面代码:
#!/bin/bash#下面设置输入文件,把用户执行pre_deal.sh命令时提供的第一个参数作为输入文件名称
infile=$1#下面设置输出文件,把用户执行pre_deal.sh命令时提供的第二个参数作为输出文件名称
outfile=$2#注意,最后的$infile> $outfile必须跟在}’这两个字符的后面
awk -F "," 'BEGIN{
srand();
id=0;
Province[0]="山东";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陕西";Province[5]="内蒙古";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
执行pre_deal.sh脚本文件,对small_user.csv进行数据预处理,命令如下:
cd /usr/local/bigdatacase/dataset
bash ./pre_deal.sh small_user.csv user_table.txt
可以查看生成的user_table.txt,但是,不要直接打开。因为文件过大,直接打开会出错,可以使用head命令查看前10行数据:
head -10 user_table.txt
执行上面命令以后,可以得到如下结果:
2.2.2.导入数据库
下面把user_table.txt中的数据导入到数据仓库 Hive中。为了完成这个操作,首先需要把user_table.txt 上传到分布式文件系统HDFS中;然后在Hive中创建一个外部表,完成数据的导入。
2.2.2.1.启动HDFS
下面登录Linux系统,打开一个终端,执行下面命令启动Hadoop:
cd /usr/local/hadoop
./sbin/start-all.sh
查看当前运行的进程
jps
2.2.2.2.把user_table.txt上传到HDFS中
现在需要把Linux本地文件系统中的user_table.txt上传到分布式文件系统HDFS中,并存放在HDFS中的/bigdatacase/ dataset目录下。
首先需要在 HDFS的根目录下面创建一个新的目录 bigdatacase,并在这个目录下创建一个子目录dataset,具体命令如下:
cd /usr/local/hadoop ./bin/hdfs dfs –mkdir -p /bigdatacase/dataset ./bin/hdfs dfs –mkdir -ls /bigdatacase
然后把Linux本地文件系统的user_table.txt上传到分布式文件系统HDFS的/bigdatacase/dataset目录下:
./bin/hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset
查看HDFS中user_table.txt的前10条记录,命令如下:
./bin/hdfs dfs-cat /bigdatacase/dataset/user_table.txt | head -10
2.2.3.在Hive下创建数据库
下面在Linux系统中再新建一个终端(可以在刚才已经建好的终端界面的左上角,单击“终端”菜单,在弹出的子菜单中选择“新建终端”)。因为需要借助于MySQL保存 Hive的元数据﹐所以,先启动MySQL数据库,可以在终端中输人如下命令:
service mysql start #可以在Linux的任何目录下执行该命令
进入Hive,命令如下:
cd /usr/local/hive
./bin/hive #启动Hive
启动成功后,就进入了hive>命令提示符状态。在Hive中创建一个数据库dblab,命令如下:
hive> create database dblab;
hive> use dblab;
2.2.3.1.创建外部表
在数据库dblab中创建一个外部表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 xmudblab!' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/bigdatacase/dataset';
2.2.3.2.查询数据
上面已经成功把 HDFS中的/bigdatacase/dataset目录下的数据加载到了数据仓库Hive 中;然后在hive>命令提示符状态下执行下面命令查看表的信息:
hive> use dblab; //使用dblab数据库
hive> show tables; //显示数据库中所有表
hive> show create table bigdata_user; //查看bigdata_user表的各种属性
查看表的简单结构:
hive> desc bigdata_user;
查询相关数据:
hive> select * from bigdata_user limit 10;
hive> select behavior_type from bigdata_user limit 10;
2.2.4.Hive进行数据分析
查看前10位用户对商品的行为:
hive> select behavior_type from bigdata_user limit 10; #查看前10位用户对商品的行为
查询前20位用户购买商品的时间和商品的种类:
hive> select visit_date, item_category from bigdata_user limit 20;
有时在表中查询可以利用嵌套语句,如果列名太复杂可以设置该列的别名,以简化操作的难度,举例如下:
hive> select e.bh, e.it from (select behavior_type as bh, item_category as it from bigdata_user) as e limit 20;
上面语句中,“behavior_type as bh,item_category as it”是为behavior_type设置别名bh,为 item_category设置别名it,FROM的括号里的内容,也设置了别名e,这样调用时就可以使用e.bh和e.it,可以简化代码。
2.2.4.1.查询条数统计分析
用聚合函数 count()计算出表内有多少行数据:
hive> select count(*) from bigdata_user;
在函数内部加上distinct,查出uid不重复的数据有多少条:
hive> select count(distinct uid) from bigdata_user;
查询不重复的数据有多少条(排除客户刷单情况):
hive>select count(*) from (select uid,item_id,behavior_type,item_category,visit_date,province from bigdata_user groupby uid,item_id,behavior_type,item_category,visit_date,province having count(*)=1)a;
2.2.4.2.关键字条件查询分析
以关键字的存在区间为条件的查询
查询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';
以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数:
hive> select count(distinct uid), day(visit_date) from bigdata_user where behavior_type='4' group by day(visit_date);
关键字赋予定值为条件,对其他数据进行分析
取给定时间和给定地点,求当天发出到该地点的货物的数量:
hive> select count(*) from bigdata_user where province='江西' and visit_date='2014-12-12' and behavior_type='4';
2.2.4.3.根据用户行为分析
查询一件商品在某天的购买比例或者浏览比例:
hive> select count(*) from bigdata_user where visit_date='2014-12-11'and behavior_type='4';#查询有多少用户在2014-12-11购
hive> select count(*) from bigdata_user where visit_date ='2014-12-11';#查询有多少用户在2014-12-11点击了该店
查询某个用户在某一天点击网站占改天所有点击行为的比例:
hive> select count(*) from bigdata_user where uid=10001082 and visit_date='2014-12-12';#查询用户10001082在2014-12-12点击网站的次数
hive> select count(*) from bigdata_user where visit_date='2014-12-12';#查询所有用户在这一天点击该网站的次数
给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户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;#查询某一天在该网站购买商品超过5次的用户id
2.2.4.4.用户实时查询分析
查询某个地区的用户当天浏览网站的次数,语句如下:
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;#创建新的数据表进行存储
hive> insert overwrite table scan select province,count(behavior_type) from bigdata_user where behavior_type='1' group by province;#导入数据
hive> select * from scan;#显示结果
2.3.Hive,MySQL,HBase数据互导
2.3.1.Hive预操作
2.3.1.1.创建临时表user_action
进入Hive与hadoop,命令如下:
cd /usr/local/hadoop
./sbin/start-all.sh #启动Hadoop
cd /usr/local/hive
./bin/hive #启动Hive
命令如下:
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;
确认这个数据文件在HDFS中确实已经被创建
cd /usr/local/hadoop
./bin/hdfs dfs -ls /user/hive/warehouse/dblab.db/user_action
2.3.1.2.将bigdata_user表中的数据插入到user_action
1.将bigdata_user表中的数据插入到user_action命令如下:
hive> INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user;
2.查询上面的插入命令是否成功
hive> select * from user_action limit 10;
2.3.2.使用Sqoop将数据从Hive导入MySQL
2.3.2.1.安装sqoop
1.访问Sqoop官网(http:// sqoop.apache. org/),下载Sqoop安装文件sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar. Gz,sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar. gz文件会被保存到“/home/hadoop/下载/”目录下。
2.执行如下命令,完成安装文件解压缩:
cd ~/下载
sudo tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /usr/local
3.将解压的文件的名称修改为sqoop,以简化操作,不用每次都输入很长的文件名,命令如下:
cd /usr/local
sudo mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop
4.接下来把sqoop文件夹的权限赋予当前的hadoop用户,命令如下:
sudo chown -R hadoop:hadoop sqoop
修改配置文件
1.执行如下命令把/usr/local/sqoop/conf目录下的配置文件 sqoop-env-template.sh 复制一份,并命名为sqoop-env.sh
cd sqoop/conf/
cat sqoop-env-template.sh >> sqoop-env.sh
2.使用vim 编辑器打开sqoop-env.sh文件进行编辑:
cd /usr/local/sqoop/conf/
vim sqoop-env.sh
3.在sqoop-env.sh文件中添加如下配置信息:
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop
export HBASE_HOME=/usr/local/hbase
export HIVE_HOME=/usr/local/hive
#export ZOOCFGDIR= #如果读者配置了ZooKeeper,也需要在此配置ZooKeeper的路径
配置环境变量
1.使用vim编辑器打开~/.bashrc文件,命令如下:
vim ~/.bashrc
2.在该文件开头加入如下代码:
export SQOOP_HOME=/usr/local/sqoop
export PATH=$PATH:$SBT_HOME/bin:$SQOOP_HOME/bin
export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib
3.保存该文件,并退出 vim编辑器。接下来执行如下命令使得环境变量立即生效:
source ~/.bashrc
添加Mysql驱动程序
把已经下载了MySQL驱动程序mysql-connector-java-5.1.40. tar.gz,并且被放入到"“/home/hadoop/下载”目录中。执行如下命令解压缩文件并复制到 Sqoop安装目录下:
cd ~/下载
sudo tar -zxvf mysql-connector-java-5.1.40.tar.gz #解压MySQL驱动包
ls #这时就可以看到解压缩后得到的目录mysql-connector-java-5.1.40
cp ./mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/sqoop/lib
测试MySql的连接
1.首先要确保 MySQL服务已经启动,如果没有启动,执行下面命令启动:
service mysql start
2.然后就可以测试 Sqoop 与 MySQL之间的连接是否成功,命令如下:
sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root -P hadoop
3.如果能够看到 MySQL数据库中的数据库列表,就表示 Sqoop安装成功。
2.3.2.2.将前面生成的临时表数据从Hive导入到MySQL中
1.登录MySQL,命令如下:
mysql –u root -p hadoop
2.进入mysql后,创建数据库
mysql> show databases; #显示所有数据库
mysql> create database dblab; #创建dblab数据库
mysql> use dblab; #使用数据库
3.查看数据库编码,mysql命令如下:
mysql>show variables like "char%";
确认编码格式为utf-8,否则无法导入中文。
4.创建表,mysql命令如下:
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;
mysql> exit #创建成功后退出
5.导入数据,命令如下:
cd /usr/local/sqoop
./bin/sqoop export --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --export-dir '/user/hive/warehouse/dblab.db/user_action' --fields-terminated-by '\t'; #导入命令
6.查看MySQL中user_action表数据,命令如下:
mysql -u root -p
mysql> use dblab;
mysql> select * from user_action limit 10;
从Hive导入数据到MySQL中的操作完成。
2.3.3.使用Sqoop将数据从MySQL导入HBase
1.使用Hadoop集群、MySQL服务、HBase服务,在终端中执行如下命令:
cd /usr/local/hbase
./bin/start-hbase.sh
2.启动HBase shell
cd /usr/local/hbase
./bin/hbase shell
3.创建表user_action,命令如下:
hbase> create 'user_action', { NAME => 'f1', VERSIONS => 5}
4.导入数据(终端中进行),命令如下:
cd /usr/local/sqoop
./bin/sqoop import --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --hbase-table user_action --column-family f1 --hbase-row-key id --hbase-create-table -m 1
5.查看HBase中user_action表数据,hbase命令如下:
hbase> scan 'user_action',{LIMIT=>10} #只查询前面10行
2.3.4.使用HBaseJava API把数据从本地导入到HBase中
1.启动 Hadoop集群、HBase服务,命令如下:
cd /usr/local/hadoop
./sbin/start-all.shcd /usr/local/hbase
./bin/start-hbase.sh
2.数据准备,命令如下:
cd /usr/local/bigdatacase/dataset
/usr/local/hadoop/bin/hdfs dfs -get /user/hive/warehouse/dblab.db/user_action .
#将HDFS上的user_action数据复制到本地当前目录,注意'.'表示当前目录
cat ./user_action/* | head -10 #查看前10行数据
cat ./user_action/00000* > user_action.output #将00000*文件复制一份重命名为user_action.output,*表示通配符
head user_action.output #查看user_action.output前10行
3.编写数据导入程序,采用Eclipse编写Java程序实现HBase数据导入功能
为了编写一个能够与HBase交互的Java应用程序,需要在这个界面中加载该Java 工程所需要用到的JAR包,这些JAR包中包含了可以访问HBase的Java API。这些JAR包都位于Linux系统的HBase安装目录的lib目录下,也就是位于/usr/local/hbase/lib目录下。单击界面中的Libraries选项卡,然后单击界面右侧的Add External JARs按钮,导入上述的包。
4.在 Eclipse中编写上述代码,并打包成可执行 jar包,命名”ImportHBase.jar ;然后在/usr/local/bigdatacase/目录下面新建一个 hbase子目录,用来有放ImportHBase.jar。
5.数据导入(再导入前清空uer_action表),命令如下:
cd /usr/lcoal/hbase
./bin/hbase shell
hbase> truncate 'user_action'
6.运行hadoop jar命令即刚刚编写的程序,命令如下:
/usr/local/hadoop/bin/hadoop jar /usr/local/bigdatacase/hbase/ImportHBase.jar HBaseImportTest
/usr/local/bigdatacase/dataset/user_action.output
7.查看HBase中user_action表数据,hbase命令如下:
habse> scan 'user_action',{LIMIT=>10} #只查询前面10行
2.4.利用R进行数据可视化分析
2.4.1.安装R
登录Linux系统,打开一个终端,并注意保持网络连通,可以访问互联网,因为安装过程要下载各种安装文件。
1.首先利用vim编辑器打开/etc/apt/sources.list 文件,命令如下:
$ sudo vim /etc/apt/sources.list
2.在文件的最后一行添加厦门大学的镜像源:
$ deb http://mirrors.xmu.edu.cn/CRAN/bin/linux/ubuntu/ trusty/
3.然后,执行如下命令更新软件源列表:
$ sudo apt-get update
4.如果更新软件源出现“由于没有公钥无法验证签名”的错误,请执行如下命令:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 51716619E084DAB9
5.接下来执行如下命令安装R语言:
$ sudo apt-get install r-base
6.从键盘输人y,按Enter键就可以顺利安装,结束安装结束后,可以执行下面命令启动R,启动后会显示如下信息,并进入>命令提示符状态:
$ R
7.最后可以执行下面命令退出R:
>q()
2.4.2.安装依赖库
1.因为后面的步骤不断报错,就上网找了很久,最后大多数都说是这个R的版本问题,所以就更新了一下R
$ sudo su
$ echo "deb http://www.stats.bris.ac.uk/R/bin/linux/ubuntu xenial-cran40/" >> /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
$ apt-get update
$ apt-get upgrade
$ sudo apt-get install r-base
从2.3.2更新到4.1.2版本
为了完成可视化分析功能,需要为R安装一些依赖库,包括 RMySQL、ggplot2,devtools和 recharts。其中,RMySQL是一个提供了访问 MySQL数据库的R语言接口程序的R语言依赖库, ggplot2和recharts则是R语言中提供绘图可视化功能的依赖库。
2.启动R进入R命令提示符状态,执行如下命令安装RMySQL:
install.packages('RMySQL')
因为我们更新了R,可能自动帮我们选择了下载源,因此不用选择镜像。
3.执行如下命令安装绘图包ggplot2,更新之后就不会报错了:
> install.packages('ggplot2')
4.执行如下命令安装绘图包devtools:
> install.packages('devtools')
5.在 Ubuntul6.04上执行devtools安装时,可能会出现3次错误,根据每次错误的英文提示信息﹐就需要3个软件: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
6.最后在R命令提示符下,再执行如下命令安装taiyun/recharts :
> devtools::install_github('taiyun/recharts')
2.4.3.可视化分析
2.4.3.1.连接MySQL并获取数据
1.进入mysql,命令如下:
$ service mysql start
$ mysql -u root -p
2.查询数据,命令如下:
mysql> use dblab;
mysql> select * from user_action limit 10;
3.切换到刚才已经打开的R命令提示符终端窗口,使用如下命令让R连接到 MySQL数据库:
>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')
2.4.3.2.分析消费者对商品的行为
summary()函数可以得到样本数据类型和长度,如果样本是数值型,还能得到样本数据的最小值、最大值,四分位数和均值信息。
1.首先使用summary()函数查看MySQL数据库中表user_action的字段behavior_type的类型,命令如下:
>summary(user_action$behavior_type)
2.可以看出,原来的MySQL数据中,表user_action的字段behavior_type的类型是字符型。这样不方便做比较,需要把 behavior_type的字段类型转换为数值型,命令如下:
>summary(as.numeric(user_action$behavior_type))
3.用柱状图展示消费者的行为类型的分布情况,命令如下:
>library(ggplot2)
>ggplot(user_action,aes(as.numeric(behavior_type)))+geom_histogram()
2.4.3.3.分析销量排行前十的商品及其销量
1.分析销量排名前十的商品及其销量,可以采用如下命令:
>temp <- subset(user_action,as.numeric(behavior_type)==4) # 获取子数据集
>count <- sort(table(temp$item_category),decreasing = T) #排序
>print(count[1:10]) # 获取第1到10个排序结果
在上面的命令语句中, subset()函数用于从某一个数据集中选择出符合某条件的数据或者相关的列。table()对应的就是统计学中的“列联表”,是一种记录频数的方法。sort()用来完成排序,返回排序后的数值向量。上述命令执行结果如下:
上面的执行结果中,第一行表示商品分类,第二行表示该类的销量。
2.用散点图展示上面的分析结果,命令如下:
>result <- as.data.frame(count[1:10]) #将count矩阵结果转换成数据框
>ggplot(result,aes(Var1,Freq,col=factor(Var1)))+geom_point()
2.4.3.4.分析每年的哪个月份销量最大
1.从 MySQL直接获取的数据中, visit_date变量都是2014年份,并没有划分出具体的月份,因此,需要在数据集中增加一列关于月份的数据,命令如下:
>month <- substr(user_action$visit_date,6,7) # visit_date变量中截取月份
>user_action <- cbind(user_action,month) # user_action增加一列月份数据
2.用柱状图展示消费者在一年的不同月份的购买量情况,命令如下:
>ggplot(user_action,aes(as.numeric(behavior_type),col=factor(month)))+geom_histogram()+facet_grid(.~month)
在上面这条命令中,aes()函数中的col属性可以用来设置颜色。factor()函数则是把数值变量转换成分类变量,从而可以用不同的颜色表示。如果不使用factor()函数﹐颜色将以同一种颜色渐变的颜色表现。facet_grid(. ~ month)表示柱状图按照不同月份进行分区.由于本案例中,MySQL获取的数据中只有11月份和12月份的数据,所以,执行结果中只会显示两个表格。上面命令的具体执行结果如下图所示。
2.4.3.5.分析国内哪个省份的消费者最有购买欲望
可以使用如下语句来分析国内各个省份的消费者的购买情况:
library(recharts)
rel <- as.data.frame(table(temp p r o v i n c e ) ) p r o v i n c e s < − r e l province)) provinces <- rel province))provinces<−relVar1
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) # 设置地图信息
eMap(mapData, namevar=~province, datavar = ~count) #画出中国地图
在上面的命令语句中, nrow()用来计算数据集的行数。
3.出现的问题以及解决方案
问题1:install.packages(‘devtools’)安装失败的解决方法
没有更新版本之前,选择任何表中的资源都会出现如下报错,显示证书问题和显示devtools不可用。
**解决方法:**后面试了很多方法,都没有用,直到看到一个帖子是反应版本问题
原因就在于我的R版本过低导致与依赖不兼容
https://zhuanlan.zhihu.com/p/129331377
已解决R包:dependencies * are not available for package - 知乎 (zhihu.com)
于是后面就找了个升级R的方法
https://blog.csdn.net/weixin_41929524/article/details/108470515
Ubuntu上更新R版本(完全攻略)_Kanny-CSDN博客_ubuntu升级r
把R升级后,完美解决问题。
因为后面的步骤不断报错,就上网找了很久,最后大多数都说是这个R的版本问题,所以就更新了一下R
$ sudo su
$ echo "deb http://www.stats.bris.ac.uk/R/bin/linux/ubuntu xenial-cran40/" >> /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
$ apt-get update
$ apt-get upgrade
$ sudo apt-get install r-base
下面简单解释一下上述代码。sudo su 表示直接使用最高的权限;echo ... >> ... 表示将一行语句写到 >> 所指的后面的文件中的最后一行;apt-get update 表示重载 sources.list 文件, apt-get upgrade 则表示对 sources.list 里面的内容进行更新升级(这样就自然将我们最新添加的内容进行升级)。
从3.2.3更新到4.1.2版本
问题2:安装devtools出现的问题以及解决方法
在安装devtools依赖的时候,出现了如下图的error,显示xml2文件依赖有错误。
**解决方法:**根据错误提示,系统提示尝试安装libxml2-dev的包
$ sudo apt-get install libxml2-dev
安装完毕后,错误就解决了devtools也顺利安装成功。