1 Hive 数据仓库实战
1.1 实验背景
Hive是重要的数据仓库工具,在数据挖掘、数据汇总、统计分析等领域有重要作用。特别的在电信业务中,Hive扮演相当重要的角色,可以利用Hive统计用户的流量、话费、资费等信息,也可挖掘出用户的消费模型以帮助运营商更好的规划套餐内容。
1.2 实验目的
掌握Hive的常用操作。
学会在Hue上使用和运行HQL。
1.3 实验任务
1.3.1 Hive常用函数
步骤 1 首先执行环境变量。
source /home/user01/hadoopClient/bigdata_env
步骤 2 进入Hive客户端beeline。
/home/user01/hadoopClient/Hive/Beeline/bin/beeline
…
Connected to: Apache Hive (version 1.3.0)
Driver: Hive JDBC (version 1.3.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.3.0 by Apache Hive
0: jdbc:hive2://192.168.225.11:21066/>
步骤 3 字符串函数length(string A)。
字符串长度函数:length
语法: length(string A)
返回值: int
说明:返回字符串A的长度
hive> select length(‘abcedfg’);
7
步骤 4 字符串反转函数reverse。
语法: reverse(string A)
返回值: string
说明:返回字符串A的反转结果
hive> select reverse(‘abcedfg’);
gfdecba
步骤 5 字符串连接函数concat。
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
hive> select concat(‘abc’,'def’,'gh’);
abcdefgh
步骤 6 带分隔符字符串连接函数concat_ws。
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
hive> select concat_ws(‘-’,'abc’,'def’,'gh’);
abc-def-gh
步骤 7 字符串截取函数substr,substring。
语法: substr(string A, int start, int len),substring(string A, int start, int len)
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
hive> select substr(‘abcde’,3,2);
cd
hive>select substr (‘abcde’,-2,2);
de
步骤 8 字符串转大写函数upper,ucase。
语法: upper(string A) ucase(string A)
返回值: string
说明:返回字符串A的大写格式
hive> select upper(‘abC’);
ABC
hive> select ucase(‘abC’);
ABC
步骤 9 字符串转小写函数lower,lcase。
语法: lower(string A) lcase(string A)
返回值: string
说明:返回字符串A的小写格式
hive> select lower(‘abC’);
abc
hive> select lcase(‘abC’);
abc
步骤 10 去空格函数trim。
语法: trim(string A)
返回值: string
说明:去除字符串两边的空格
hive> select trim(‘ abc ‘);
abc
步骤 11 分割字符串函数split。
语法: split(string str, string pat)
返回值: array
说明: 按照pat字符串分割str,会返回分割后的字符串数组
hive> select split(‘abtcdtef’,'t’);
[“ab”,“cd”,“ef”]
步骤 12 日期函数。
获取当前UNIX时间戳函数: unix_timestamp
语法: unix_timestamp()
返回值: bigint
说明: 获得当前时区的UNIX时间戳。
hive> select unix_timestamp();
1521511607
UNIX时间戳转日期函数: from_unixtime
语法:from_unixtime(bigint unixtime[, string format])
返回值: string
说明: 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式。
hive> select from_unixtime(1521511607,‘yyyyMMdd’);
20180320
1.3.2 Hive创建表
1.3.2.1 建表语句
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
1.3.2.2 创建内部表
创建内部表cga_info1,包含name,gender和time三列。
create table cga_info1(name string,gender string,time int) row format delimited fields terminated by ‘,’ stored as textfile;
No rows affected (0.293 seconds)
其中,row format delimited fields terminated by ','表示行分隔符设置为’,’,如果不设置则使用默认分隔符。Hive的HQL语句最后是以’;’结束的。
查看表“cga_info1”:
show tables like ‘cga_info1’;
±-----------±-+
| tab_name |
±-----------±-+
| cga_info1 |
±-----------±-+
1 row selected (0.07 seconds)
1.3.2.3 创建外部表
创建外部表时要注明external table。
create external table cga_info2 (name string,gender string,time int) row format delimited fields terminated by ‘,’ stored as textfile;
No rows affected (0.343 seconds)
查看创建表“cga_info2”。
show tables like ‘cga_info2’;
±-----------±-+
| tab_name |
±-----------±-+
| cga_info2 |
±-----------±-+
1 row selected (0.078 seconds)
1.3.2.4 载入本地数据
步骤 1 预先在本地建立一个文件。
touch ‘cga111.dat’
步骤 2 使用vim命令编辑文件cga111.dat,按照name,gender,time的先后顺序输入几行数据,行分隔符为’,’ , 换行按enter,输入完毕后按ESC,:wq,保存并退出到linux界面。
vim ‘cga111.dat’
步骤 3 重新进入Hive。
beeline
步骤 4 建立一个名为“cga_info3”的表。
create table cga_info3(name string,gender string,time int) row format delimited fields terminated by ‘,’ stored as textfile;
No rows affected (0.408 seconds)
步骤 5 将本地数据“cga111.dat”载入表“cga_info3”中。
load data local inpath ‘/tmp/cga111.dat’ into table cga_info3;
INFO : Loading data to table default.cga_info3 from file:/tmp/cga111.dat
No rows affected (0.516 seconds)
步骤 6 查询表“cga_info3”中的内容。
select * from cga_info3;
±----------------±------------------±----------------±-+
| cga_info3.name | cga_info3.gender | cga_info3.time |
±----------------±------------------±----------------±-+
| xiaozhao | female | 20 |
| xiaoqian | male | 21 |
| xiaosun | male | 25 |
| xiaoli | female | 40 |
| xiaozhou | male | 33 |
±----------------±------------------±----------------±-+
5 rows selected (0.287 seconds)
由此可见,已经成功将本地文件“cga111.dat”中的内容加载到了Hive表“cga_info3”中。
1.3.2.5 载入HDFS数据
步骤 1 首先在HDFS上创建文件夹“/cga/cg”。
hdfs dfs -mkdir /cga
18/04/12 19:43:54 INFO hdfs.PeerCache: SocketCache disabled.
hdfs dfs -mkdir /cga/cg
18/04/12 19:44:24 INFO hdfs.PeerCache: SocketCache disabled.
步骤 2 将tmp文件夹中的本地文件“cga111.dat”上传到HDFS的文件夹“/cga/cg”。
hdfs dfs -put cga111.dat /cga/cg
18/04/12 14:19:39 INFO hdfs.PeerCache: SocketCache disabled.
步骤 3 重新进入Hive。
beeline
步骤 4 建立一个名为“cga_info4”的表。
create table cga_info4(name string,gender string,time int) row format delimited fields terminated by ‘,’ stored as textfile;
No rows affected (0.404 seconds)
步骤 5 将HDFS文件“cga111.dat”载入表“cga_info4”中。
load data inpath ‘/cga/cg/cga111.dat’ into table cga_info4;
INFO : Loading data to table default.cga_info4 from hdfs://hacluster/app_stu01/cga111.dat
No rows affected (0.341 seconds)
注:加载本地数据和HDFS数据使用的命令略有不同:
加载本地文件:load data local inpath ‘local_inpath’ into table hive_table;
加载HDFS文件:load data inpath ‘HDFS_inpath’ into table hive_table。
步骤 6 查询表“cga_info4”中的内容。
select * from cga_info4;
±----------------±------------------±----------------±-+
| cga_info4.name | cga_info4.gender | cga_info4.time |
±----------------±------------------±----------------±-+
| xiaozhao | female | 20 |
| xiaoqian | male | 21 |
| xiaosun | male | 25 |
| xiaoli | female | 40 |
| xiaozhou | male | 33 |
±----------------±------------------±----------------±-+
5 rows selected (0.303 seconds)
由此可见,已经将HDFS文件“cga111.dat”的内容加载到了Hive表“cga_info3”中。
1.3.2.6 创建表时载入数据
创建表“cga_info5”同时载入HDFS上cga111.dat的数据。
create external table cga_info5 (name string,gender string,time int) row format delimited fields terminated by ‘,’ stored as textfile location ‘/cga/cg’;
No rows affected (0.317 seconds)
查询表“cga_info5”中的内容。
select * from cga_info5;
±----------------±------------------±----------------±-+
| cga_info5.name | cga_info5.gender | cga_info5.time |
±----------------±------------------±----------------±-+
| xiaozhao | female | 20 |
| xiaoqian | male | 21 |
| xiaosun | male | 25 |
| xiaoli | female | 40 |
| xiaozhou | male | 33 |
±----------------±------------------±----------------±-+
5 rows selected (0.268 seconds)
由此可见,我们成功的在创建表“cga_info5”的同时载入了HDFS上cga111.dat的数据。