【步骤一】本地数据集上传到数据仓库Hive
写在前面
简介:本文章基于厦门大学提供的大数据课程实验案例:网站用户行为分析,通过使用 CentOS 操作编写而来。具体介绍请打开链接进行阅读。
这里介绍几点值得特别注意的事项:
1、对于案例所涉及的系统及软件此文档使用的是以下版本,其他软件版本随意:
- Linux系统(CentOS7)
- MySQL(5.7)
- Hadoop(3.1.3)
- HBase(2.2.2,HBase版本需要和Hadoop版本兼容)
- Hive(3.1.2,Hive需要和Hadoop版本兼容)
- Sqoop(1.4.7)
- R(3.6.0)
- IDEA( 2023.3.6 社区版)
PS:Hadoop 与 HBase、Hive 版本一定要兼容!!!版本一定要兼容!!!这很重要!!!😃😃😃其他软件随意。
2、所有下载的安装包均在 /
目录下。所有安装的软件均在 /usr/local/
目录下以 软件名-版本号
方式命名。在进行每个软件的安装操作之前请先整体阅读整个软件安装流程的文章有个整体思路,了解到安装此软件需要做哪些设置再进行操作,这样可以避免很多不必要的麻烦。
3、此案例分为五个步骤,请按照步骤顺序进行阅读!!🙂🙂
1. 实验数据集的下载
本案例采用的数据集为 user.zip
,包含了一个大规模数据集 raw_user.csv
(包含2000万条记录),和一个小数据集 small_user.csv
(只包含30万条记录)。小数据集 small_user.csv
是从大规模数据集 raw_user.csv
中抽取的一小部分数据。之所以抽取出一少部分记录单独构成一个小数据集,是因为,在第一遍跑通整个实验流程时,会遇到各种错误,各种问题,先用小数据集测试,可以大量节约程序运行时间。等到第一次完整实验流程都顺利跑通以后,就可以最后用大规模数据集进行最后的测试。
下面,请在本机先下载 user.zip数据集 ,然后上传到自己的 Linux 系统。或者直接在虚拟机的浏览器打开下载。
我这里将它上传到 Linux 的 /
目录:
1 | # 进入 / 目录 |
通过上面命令,就进入到了 user.zip 文件所在的目录,并且可以看到有个 user.zip 文件。注意,如果你把 user.zip 下载到了其他目录,这里请进入到你自己的存放 user.zip 的目录。
下面需要把 user.zip 进行解压缩,我们需要首先建立一个用于运行本案例的目录 bigdatacase,请执行以下命令:
1 | cd /usr/local |
现在你就可以看到在dataset目录下有两个文件:raw_user.csv
和 small_user.csv
我们执行下面命令取出前面 5 条记录看一下:
1 | head -5 raw_user.csv |
可以看到,前 5 行记录如下:
1 | user_id,item_id,behavior_type,user_geohash,item_category,time |
可以看出,每行记录都包含 5 个字段,数据集中的字段及其含义如下:
1 | user_id(用户id) |
2. 数据集的预处理
2.1 删除文件第一行记录,即字段名称
raw_user
和 small_user
中的第一行都是字段名称,我们在文件中的数据导入到数据仓库 Hive 中时,不需要第一行字段名称。因此,这里在做数据预处理时,删除第一行
1 | cd /usr/local/bigdatacase/dataset |
接下来的操作中,我们都是用 small_user.csv
这个小数据集进行操作,这样可以节省时间。等所有流程都跑通以后,你就可以使用大数据集 raw_user.csv
去测试一遍了。
2.2 对字段进行预处理
下面对数据集进行一些预处理,包括为每行记录增加一个 id
字段(让记录具有唯一性)、增加一个省份字段(用来后续进行可视化分析),并且丢弃 user_geohash
字段(后面分析不需要这个字段)。
下面我们要建一个脚本文件 pre_deal.sh
,请把这个脚本文件放在 dataset
目录下,和数据集 small_user.csv
放在同一个目录下:
1 | cd /usr/local/bigdatacase/dataset |
上面使用 vim 编辑器新建了一个 pre_deal.sh
脚本文件,请在这个脚本文件中加入下面代码:
1 | !/bin/bash |
上面的代码的基本形式是:
1 | 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
进行数据预处理,命令如下:
1 | cd /usr/local/bigdatacase/dataset |
可以使用 head 命令查看生成的 user_table.txt
,不要直接打开,文件过大,会出错,下面查看前 10 行数据:
1 | head -10 user_table.txt |
可以得到如下结果:
1 | 1 10001082 285259775 1 4076 2014-12-08 吉林 |
2.3 导入数据库
下面要把 user_table.txt
中的数据最终导入到数据仓库 Hive 中。为了完成这个操作,我们会首先把 user_table.txt
上传到分布式文件系统 HDFS 中,然后,在 Hive 中创建一个外部表,完成数据的导入。
1、启动HDFS
请执行下面命令启动 Hadoop(如果你已经启动了 Hadoop 就不用再次启动了):
1 | 启动 Hadoop |
如果出现下面这些进程,说明 Hadoop 启动成功了。
1 | NameNode |
2、把 user_table.txt 上传到 HDFS 中
现在,我们要把 Linux 本地文件系统中的 user_table.txt
上传到分布式文件系统 HDFS 中,存放在 HDFS 中的 /bigdatacase/dataset
目录下。
首先,请执行下面命令,在 HDFS 的根目录下面创建一个新的目录 bigdatacase,并在这个目录下创建一个子目录 dataset,如下:
1 | cd /usr/local/hadoop-3.1.3 |
然后,把 Linux 本地文件系统中的 user_table.txt
上传到分布式文件系统 HDFS 的 /bigdatacase/dataset
目录下,命令如下:
1 | hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset |
下面可以查看一下 HDFS 中的 user_table.txt
的前 10 条记录,命令如下:
1 | hdfs dfs -cat /bigdatacase/dataset/user_table.txt | head -10 |
1 | 1 10001082 285259775 1 4076 2014-12-08 吉林 |
3、在 Hive 上创建数据库
启动 MySQL 数据库:
1 | 查看 MySQL 状态 |
由于 Hive 是基于 Hadoop 的数据仓库,使用 HiveQL 语言撰写的查询语句,最终都会被 Hive 自动解析成 MapReduce 任务由 Hadoop去具体执行,因此,需要启动 Hadoop,然后再启动 Hive。由于前面我们已经启动了 Hadoop,所以,这里不需要再次启动 Hadoop。下面,在这个新的终端中执行下面命令进入 Hive:
1 | 启动Hive |
启动成功以后,就进入了 hive>
命令提示符状态,可以输入类似 SQL 语句的 HiveQL 语句。
下面,我们要在 Hive 中创建一个数据库 dblab,命令如下:
1 | create database dblab; |
4、创建外部表
在数据库 dblab 中创建一个外部表 bigdata_user
,它包含字段 id, uid, item_id, behavior_type, item_category, date, province
,请在 hive 命令提示符下输入如下命令:
1 | 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'; |
5、查询数据
上面已经成功把 HDFS 中的 /bigdatacase/dataset
目录下的数据加载到了数据仓库 Hive 中,我们现在可以使用下面命令查询一下:
1 | select * from bigdata_user limit 10; |
结果:
1 | OK |
1 | select behavior_type from bigdata_user limit 10; |
结果:
1 | OK |