大数据案例-步骤一:本地数据集上传到数据仓库Hive

大数据技术原理与应用

返回大数据案例首页
《大数据课程实验案例:网站用户行为分析—-步骤一:本地数据集上传到数据仓库Hive》
开发团队:厦门大学数据库实验室 联系人:林子雨老师 ziyulin@xmu.edu.cn
版权声明:版权归厦门大学数据库实验室所有,请勿用于商业用途;未经授权,其他网站请勿转载

所需知识储备

Linux系统基本命令、Hadoop项目结构、分布式文件系统HDFS概念及其基本原理、数据仓库概念及其基本原理、数据仓库Hive概念及其基本原理

训练技能

Hadoop的安装与基本操作、HDFS的基本操作、Linux的安装与基本操作、数据仓库Hive的安装与基本操作、基本的数据预处理方法

任务清单

  1. 安装Linux系统
  2. 数据集下载与查看
  3. 数据集预处理
  4. 把数据集导入分布式文件系统HDFS中
  5. 在数据仓库Hive上创建数据库

Linux系统的安装

本实验全部在Linux系统下开展,因此,必须要安装好Linux系统。关于需要什么样的电脑硬件配置,以及如何安装Linux系统,请参考厦大数据库实验室在线教程《Linux系统安装》。

实验数据集的下载

本案例采用的数据集为user.zip,包含了一个大规模数据集raw_user.csv(包含2000万条记录),和一个小数据集small_user.csv(只包含30万条记录)。小数据集small_user.csv是从大规模数据集raw_user.csv中抽取的一小部分数据。之所以抽取出一少部分记录单独构成一个小数据集,是因为,在第一遍跑通整个实验流程时,会遇到各种错误,各种问题,先用小数据集测试,可以大量节约程序运行时间。等到第一次完整实验流程都顺利跑通以后,就可以最后用大规模数据集进行最后的测试。

下面,请登录Linux系统(本教程统一采用hadoop用户登录),并在Linux系统中打开浏览器(一般都是火狐Firefox浏览器),然后,在Linux系统的浏览器中打开本网页,点击这里下载user.zip数据集。如果在下载的时候,你没有修改文件保存路径,火狐浏览器会默认把文件保存在你的当前用户的下载目录下,因为本教程是采用hadoop用户名登录了Linux系统,所以,下载后的文件会被浏览器默认保存到"/home/hadoop/下载/"这目录下面。
现在,请在Linux系统中打开一个终端(可以使用快捷键Ctrl+Alt+T),执行下面命令:

cd /home/hadoop/下载
ls

通过上面命令,就进入到了user.zip文件所在的目录,并且可以看到有个user.zip文件。注意,如果你把user.zip下载到了其他目录,这里请进入到你自己的存放user.zip的目录。
下面需要把user.zip进行解压缩,我们需要首先建立一个用于运行本案例的目录bigdatacase,请执行以下命令:

cd /usr/local
ls
sudo mkdir bigdatacase
//这里会提示你输入当前用户(本教程是hadoop用户名)的密码
//下面给hadoop用户赋予针对bigdatacase目录的各种操作权限
sudo chown -R hadoop:hadoop ./bigdatacase
cd bigdatacase
//下面创建一个dataset目录,用于保存数据集
mkdir dataset
//下面就可以解压缩user.zip文件
cd ~  //表示进入hadoop用户的目录
cd 下载
ls
unzip user.zip -d /usr/local/bigdatacase/dataset
cd /usr/local/bigdatacase/dataset
ls

现在你就可以看到在dataset目录下有两个文件:raw_user.csv和small_user.csv。
我们执行下面命令取出前面5条记录看一下:

head -5 raw_user.csv

可以看到,前5行记录如下:

user_id,item_id,behavior_type,user_geohash,item_category,time
10001082,285259775,1,97lk14c,4076,2014-12-08 18
10001082,4368907,1,,5503,2014-12-12 12
10001082,4368907,1,,5503,2014-12-12 12
10001082,53616768,1,,9762,2014-12-02 15

可以看出,每行记录都包含5个字段,数据集中的字段及其含义如下:

user_id(用户id)
item_id(商品id)
behaviour_type(包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4)
user_geohash(用户地理位置哈希值,有些记录中没有这个字段值,所以后面我们会用脚本做数据预处理时把这个字段全部删除)
item_category(商品分类)
time(该记录产生时间)

数据集的预处理

1.删除文件第一行记录,即字段名称
raw_user和small_user中的第一行都是字段名称,我们在文件中的数据导入到数据仓库Hive中时,不需要第一行字段名称,因此,这里在做数据预处理时,删除第一行

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

接下来的操作中,我们都是用small_user.csv这个小数据集进行操作,这样可以节省时间。等所有流程都跑通以后,你就可以使用大数据集raw_user.csv去测试一遍了。

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

上面的代码的基本形式是:

awk -F "," '处理逻辑' $infile > $outfile

使用awk可以逐行读取输入文件,并对逐行进行相应操作。其中,-F参数用于指出每行记录的不同字段之间用什么字符进行分割,这里是用逗号进行分割。处理逻辑代码需要用两个英文单引号引起来。 $infile是输入文件的名称,我们这里会输入raw_user.csv,$outfile表示处理结束后输出的文件名称,我们后面会使用user_table.txt作为输出文件名称。

在上面的pre_deal.sh代码的处理逻辑部分,srand()用于生成随机数的种子,id是我们为数据集新增的一个字段,它是一个自增类型,每条记录增加1,这样可以保证每条记录具有唯一性。我们会为数据集新增一个省份字段,用来进行后面的数据可视化分析,为了给每条记录增加一个省份字段的值,这里,我们首先用Province[]数组用来保存全国各个省份信息,然后,在遍历数据集raw_user.csv的时候,每当遍历到其中一条记录,使用value=int(rand()*34)语句随机生成一个0-33的整数,作为Province省份值,然后从Province[]数组当中获取省份名称,增加到该条记录中。

substr($6,1,10)这个语句是为了截取时间字段time的年月日,方便后续存储为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个字段,所以,没有出现$4。我们生成后的文件是“\t”进行分割,这样,后续我们去查看数据的时候,效果让人看上去更舒服,每个字段在排版的时候会对齐显示,如果用逗号分隔,显示效果就比较乱。

最后,保存pre_deal.sh代码文件,退出vim编辑器。
下面就可以执行pre_deal.sh脚本文件,来对small_user.csv进行数据预处理,命令如下:

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

可以使用head命令查看生成的user_table.txt,不要直接打开,文件过大,会出错,下面查看前10行数据:

head -10 user_table.txt

可以得到如下结果:

1   10001082    285259775   1   4076    2014-12-08  广东
2   10001082    4368907 1   5503    2014-12-12  河南
3   10001082    4368907 1   5503    2014-12-12  甘肃
4   10001082    53616768    1   9762    2014-12-02  北京市
5   10001082    151466952   1   5232    2014-12-12  安徽
6   10001082    53616768    4   9762    2014-12-02  北京市
7   10001082    290088061   1   5503    2014-12-12  山东
8   10001082    298397524   1   10894   2014-12-12  福建
9   10001082    32104252    1   6513    2014-12-12  湖南
10  10001082    323339743   1   10894   2014-12-12  山东

3.导入数据库
下面要把user_table.txt中的数据最终导入到数据仓库Hive中。为了完成这个操作,我们会首先把user_table.txt上传到分布式文件系统HDFS中,然后,在Hive中创建一个外部表,完成数据的导入。

a.启动HDFS
HDFS是Hadoop的核心组件,因此,需要使用HDFS,必须安装Hadoop。关于如何安装Hadoop,请参考厦大数据库实验室博客《Hadoop安装教程:单机/伪分布式配置》。这里假设你已经安装了Hadoop,本教程使用的是Hadoop2.7.1版本,安装目录是“/usr/local/hadoop”。

下面,请登录Linux系统,打开一个终端,执行下面命令启动Hadoop:

cd /usr/local/hadoop
./sbin/start-all.sh

然后,执行jps命令看一下当前运行的进程:

jps

如果出现下面这些进程,说明Hadoop启动成功了。

3765 NodeManager
3639 ResourceManager
3800 Jps
3261 DataNode
3134 NameNode
3471 SecondaryNameNode

b.把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

然后,把Linux本地文件系统中的user_table.txt上传到分布式文件系统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

c.在Hive上创建数据库
关于什么是数据仓库Hive?Hive的运行基本原理是什么?如何开展Hive简单编程实践?这些问题可以参考厦大数据库实验室制作的在线课程(含视频、讲义PPT和电子书)《基于Hadoop的数据仓库Hive》。
本案例教程需要安装数据仓库Hive,请参考厦大数据库实验室博客《Hive安装指南》来完成Hive的安装。这里假设你已经完成了Hive的安装,并且使用MySQL数据库保存Hive的元数据。本教程安装的是Hive2.1.0版本,安装目录是“/usr/local/hive”。
下面,请在Linux系统中,再新建一个终端(可以在刚才已经建好的终端界面的左上角,点击“终端”菜单,在弹出的子菜单中选择“新建终端”)。因为需要借助于MySQL保存Hive的元数据,所以,请首先启动MySQL数据库:

service mysql start  //可以在Linux的任何目录下执行该命令

由于Hive是基于Hadoop的数据仓库,使用HiveQL语言撰写的查询语句,最终都会被Hive自动解析成MapReduce任务由Hadoop去具体执行,因此,需要启动Hadoop,然后再启动Hive。由于前面我们已经启动了Hadoop,所以,这里不需要再次启动Hadoop。下面,在这个新的终端中执行下面命令进入Hive:

cd /usr/local/hive
./bin/hive   //启动Hive

启动成功以后,就进入了“hive>”命令提示符状态,可以输入类似SQL语句的HiveQL语句。
下面,我们要在Hive中创建一个数据库dblab,命令如下:

hive>  create database dblab;
hive>  use dblab;

d.创建外部表
关于数据仓库Hive的内部表和外部表的区别,请访问网络文章《Hive内部表与外部表的区别》。本教程采用外部表方式。
这里我们要在数据库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 xmu dblab!' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/bigdatacase/dataset';

e.查询数据
上面已经成功把HDFS中的“/bigdatacase/dataset”目录下的数据加载到了数据仓库Hive中,我们现在可以使用下面命令查询一下:

hive>  select * from bigdata_user limit 10;
hive>  select behavior_type from bigdata_user limit 10;

步骤一的实验顺利结束。可以继续访问下一个步骤:《大数据课程实验案例:网站用户行为分析—-步骤二:Hive数据分析

返回大数据案例首页