Hive知识点总结(一)

众所周知实际开发过程中,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';
外部表和内部表的特性差别:
1、内部表的目录在hive的仓库目录中 ,而外部表的目录由用户指定;
2、drop一个内部表时:hive会清除相关元数据,并删除表数据目录;

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;

猜你喜欢

转载自blog.csdn.net/qq_26803795/article/details/80780237