众所周知实际开发过程中,Hive主要是通过其丰富的内置函数,便捷的类sql来处理经过MapReduce清洗后的数据,下面我们进行Hive的知识点总结。
1、Hive使用方式
方式1:学习时使用的最基本的简单查询:
bin/hive //启动hive
hive>select * from t_test; //进行简单使用
方式2:作为服务启动并使用:
bin/hiveserver2 -hiveconf hive.root.logger=DEBUG,console //前台启动
nohup bin/hiveserver2 1>/dev/null 2>&1 & //后台启动
通过服务启动成功后,可以去别的节点,通过beeline来连接使用
连接方式1:
bin/beeline //回车,进入beeline的命令界面
进入beeline命令界面后输入:
beeline> !connect jdbc:hive2//mini1:10000 //mini1是hiveserver所启动的那台主机名,端口默认是10000
然后就可以正常进行Hive操作了
连接方式2:
在启动的时候连接
bin/beeline -u jdbc:hive2://mini1:10000 -n root
接下来就可以进行Hive操作了
方式3:脚本化运行使用
在实际的生产过程中,上述两种方法由于是交互式查询,效率会比较低,无法应对大量的Hive查询任务。因此,更多的会选择脚本化运行机制,该机制的核心是Hive可以用一次性命令的方式来执行给定的HQL语句。
比如,可以将sql语句写入shell脚本,以便于脚本化运行hive任务,并可以控制、调度众多的hive任务:
vi t_order_etl.sh
#!/bin/bash
hive -e "select * from db_order.t_order"
hive -e "select * from default.t_user"
hql="create table default.t_bash as select * from db_order.t_order"
hive -e "$hql"
然后运行该shell即可,当然如果sql比较复杂的话,上述方式就不可取了,我们可以把hql语句写入文件中:
vi x.hql
select * from db_order.t_order;
select count(1) from db_order.t_user;
然后使用hive -f x.hql来执行即可。
2、创建库表、数据导入导出及文件格式
2.1、创建库
hive中有一个默认的库:
库名: default
库目录:/hive安装目录/warehouse
新建库:
create database db_order;
库建好后,在hdfs中会生成一个库目录:
hdfs://hdp20-01:9000/user/hive安装目录/warehouse/db_order.db
2.2、创建表
use db_order;
create table t_order(id string,create_time string,amount float,uid string);
表建好后,会在所属的库目录中生成一个表目录
/user/hive/warehouse/db_order.db/t_order
只是,这样建表的话,hive会认为表数据文件中的字段分隔符为 ^A
因此正确的建表语句为:
create table t_order(id string,create_time string,amount float,uid string)
row format delimited
fields terminated by ',';
这样就指定了,我们的表数据文件中的字段分隔符为 ","
2.2.1、创建外部表
默认情况下创建的表称为内部表(MANAGED_TABLE),外部表(EXTERNAL_TABLE)关键字:external,需要自己指定表目录存放地址:
create external table t_3(id int,name string,salary bigint,add string)
row format delimited
fields terminated by ','
location '/aa/bb';
外部表和内部表的特性差别:
3、drop一个外部表时:hive只会清除相关元数据。
因此实际开发中:
一个hive的数据仓库,最底层的表,一定是来自于外部系统,为了不影响外部系统的工作逻辑,在hive中可建external表来映射这些外部系统产生的数据目录,并且就算在hive中把这个表给drop掉,也不会删除数据目录,也就不会影响到别的应用系统;然后在后续的etl操作,产生的各种表建议用managed_table。
2.2.2、创建分区表
分区的意义在于可以将数据分子目录存储,以便于查询时让数据读取范围更精准;
比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有时候,我们可能只需要对某一天的浏览记录进行分析
这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区;当然,每日的分区目录,应该有一个目录名(分区字段)。
create table t_4(ip string,url string,staylong int)
partitioned by (day string) -- 分区标识不能存在于表字段中
row format delimited
fields terminated by ',';
2.2.3、CTAS建表
(1)可以通过已存在表来建表:
create table t_user_2 like t_user;
新建的t_user_2表结构定义与源表t_user一致,但是没有数据
(2)在建表的同时插入数据:
create table t_access_user
as
select ip,url from t_access;
t_access_user会根据select查询的字段来建表,同时将查询的结果插入新表中。
2.3、导入数据
方式1:导入数据的一种方式:
手动用hdfs命令,将文件放入表目录;
方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录:
hive>load data local inpath '/root/order.data.2' into table t_order;
方式3:用hive命令导入hdfs中的数据文件到表目录:
不加local关键字,则是从hdfs的路径中移动文件到表目录中:
hive>load data inpath '/access.log.2017-08-06.log' into table t_access partition(dt='20170806');
hive>load data inpath '/user.data.2' into table t_1;
注意:导本地文件和导HDFS文件的区别:
hdfs文件导入表:移动
2.4、导出数据
(1)将hive表中的数据导入HDFS的文件:
insert overwrite directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access;
(2)将hive表中的数据导入本地磁盘文件:
insert overwrite local directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access limit 100000;
2.5、文件格式
HIVE支持很多种文件格式: SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE
create table t_access_text(ip string,url string,access_time string)
row format delimited fields terminated by ','
stored as textfile;