下面是本课程概览:
(1)hive系列之简介,安装,beeline和hiveserver2
(2)hive系列之基本操作
(3)hive系列之udf
(4)hive系列之二级分区和动态分区
(5)hive系列之分桶表
(6)hive系列之常用函数
(7)hive系列之系统讲解开窗函数
(8)hive系列之存储格式及常用压缩格式
(9)hive系列之数据仓库建模理论
(10)hive系列之数据仓库建模-维度表和事实表
(11)hive系列之数据仓库建模-退化维度和缓慢变化维
(12)hive系列之常用企业性能优化1
(13)hive系列之常用企业性能优化2
(14)hive系列之常用企业性能优化3
今天是第二讲,Hive 的基本操作
今天的内容比较多,也比较枯燥,尽可能对着操作一遍,加深认识
01
数据库相关
1.创建数据库
create database db_hive;
create database if not exists db_hive;
2.创建数据库到指定目录下
create database if not exists db_hive_03 location '/user/wangkai/hive/warehouse/db_hive03.db';
3.显示当前所有的数据库
show databases;
4.查看数据库描述
desc database db_hive;
5.删除数据库就不说了,很危险
02
数据类型
1、基本类型
这里着重说一下 TIMESTAMP
TIMESTAMP 类型的主要作用是在数据比较的效率上比较高
TIMESTAMP 类型 ,其对应的格式为:yyyy-MM-dd HH:MM:SS,从文件中导入时,必须满足这个格式的才能导入,否则显示为null
比如现在建一个表
create table dw.t_date (
t1 date,
t2 timestamp
)
comment '日期测试表'
row format delimited
fields terminated by ',';
创建文件提交到 hdfs 上
文件内容:
2019-09-01,2019-09-01 11:12:00
2019-08-01,2019-09-01 12:00
加载到表中
LOAD DATA INPATH '/tmp/datetest/date.txt' into TABLE dw.t_date;
最终t2不满足格式,所以显示了null
Hive 中比较常用的时间相关的udf :
unix_timestamp() 返回当前的时间戳
unix_timestamp('2019-09-01 11:10:10') 返回指定日期的时间戳
from_unixtime(1567307471) 返回 yyyy-MM-dd HH:MM:SS 格式的字符串
2、复杂类型
ARRAY、Map、struct、union,这些复杂类型是由基础类型构成的
(1) Array
表示数组,是具有相同类型的变量的集合,这些变量称为数组的元素,每个元素都有下标,从0开始
如下,我们建一张 person 表,名字、工作地点、爱好
create table dw.person(
name string,
work_locations array<string>,
other_info map<string,string>,
other_info2 struct<one:string,two:int>
)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by ':';
字段的分隔符是 ,
集合(数组和map)元素的分隔符是 |
map或者struct 的 键值对分隔符是 :
测试数据如下:
导入到表中
查询第一个工作地点:
select name,work_locations[0] from dw.person;
(2) Map
是一组键值对元组集合,使用数组表示法,map['first'] 可以获取值
比如上面的表中,查询性别
select name,other_info['sex'] from dw.person;
(3)Struct
是不同类型元素的集合,可以用 点 描述符来取元素
select name,other_info2.one from dw.person;
03
内部表、外部表、分区表
1、内部表和外部表的区别
(1)未被 external 修饰的是内部表,被 external 关键字修饰的是外部表
(2)内部表由 Hive 自身管理,外部表由 HDFS 管理(也就是数据在别的目录下,但元数据还是由 Hive 管理的)
(3)内部表数据的存储位置是:hive.metastore.warehouse.dir(默认是:/user/hive/warehouse),外部表数据的存储位置由自己制定
(4)删除内部表会直接删除元数据和存储在表下面的数据,而删除外部表只会删除元数据,HDFS 上的数据并不会被删除
2、分区表
为了对表进行合理的管理,以及提高查询的效率,Hive 可以将表组织成分区,一个分区实际上就是一个目录,一个表可以在多个维度上创建分区,分区之间的关系,就是目录树的关系。
就是在系统上创建文件夹,把分类数据放在不同的文件夹下,加快查询速度。
比如创建日期和公司两个分区,那么就可以指定查询某个月某个公司的数据,而不同全表扫描
3、实战
(1)内部表
上面建的dw.person 就是内部表,hive 会在 hdfs 文件上创建一个目录,删除表的时候,目录下的数据也会被删除
(2)外部表
使用关键字 external
create external table dw.t_test2 (
c1 string,
c2 string
)
如果没有指定位置,hive 会生成一个目录,如果指定了位置,那么不会创建目录
create external table dw.t_test3 (
c1 string,
c2 string
)
location '/tmp/person';
删除表,并不会删除 hdfs 文件的
(3)分区表
create table dw.t_test4 (
c1 string,
c2 string
)
partitioned by (appId string)
新增分区
alter table dw.t_test4 add partition(appId='app');
会在hdfs上新增一个目录
(4)外部分区表
顾名思义,即是外部表,又是分区表
create external table dw.t_test5 (
c1 string,
c2 string
)
partitioned by (appId string);
给外部分区表添加记录
alter table dw.t_test4 add partition(appId='app') location '/tmp/test1';
04
其他建表方式
1.用查询出来的数据建表
create table IF NOT EXISTS dw.log_20170629_2
AS select ip,user from dw.log_20170629;
2.仅仅创建已有表的表结构
create table IF NOT EXISTS dw.log_20170630
like dw.log_20170629;
05
加载和导出数据
1.加载数据
(1)这个命令是从本地拷贝文件到集群上,如果文件存在,则会重命名新增一份文件
load data local inpath '/opt/datas/student.txt' into table dw.student;
(2)加载数据并覆盖原有数据,会删除原有文件,再拷贝
load data local inpath '/opt/datas/student.txt' overwrite into table dw.student;
(3)加载数据到分区表
load data local inpath '/home/hadoop/data/emp.txt' into table dw.emp_partition partition (month='201509');
(4)加载hdfs数据,从hdfs移动数据到集群上
load data inpath '/opt/datas/student.txt' into table dw.student;
2.导出数据
(1)导出文件到本地目录
insert overwrite local directory '/home/hadoop/data/hive_exp_emp2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
select * from default.emp;
(2)hive命令
bin/hive -e "select * from default.emp;" > /opt/datas/exp_res.txt
(3)导出到hdfs中
insert overwrite directory '/user/wangkai/hive/hive_exp_emp'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' COLLECTION ITEMS TERMINATED BY 'n'
下一篇是 hive 的 udf ,持续关注 kk大数据 噢