**Hive**
** Facebook开源
** 官网:hive.apache.org
** Hive是基于Hadoop的一个数据仓库工具
Hive与数据库:
数据库: mysql、oracle、DB2、sqlserver
数据仓库 !== 数据库 换言之, Hive不是数据库
为什么要选择hive
MapReduce编程成本高
针对传统的DBA,不会不熟悉java,要想数据分析,借助Hive
Hive简介:
** 流程
hql --> Hive(java) --> mapreduce -->yarn --> hdfs
本质: 将HQL转化成MapReduce程序
使用MapReduce计算模型,运行在yarn平台之上
Hive适合离线批量处理,延时比较大
不适合在线业务实时分析结果,业务要求延时较低的场景不适合
Hive体系结构
** 用户接口: Client
** 终端命令行CLI --主要的一种使用方式
JDBC方式 --几乎不用
元数据:metastore
** 默认apache使用的是derby数据库(只能有一个客户端使用),CDH使用postgreDB
** 企业通常我们会选择另外一种mysql来存储
元数据包括:表名、表所属的数据库(默认是default)、
表的拥有者、列/分区字段、表的类型(是否是外部表)、
表的数据所在目录等
** 这里并没有存储Hive表的真实数据
** Hadoop
使用HDFS进行存储
使用MapReduce进行计算
驱动器: Driver
解析器: 解析Hql语句
编译器: 把sql语句翻译成MapReduce程序
优化器: 优化sql语句
执行器: 在yarn平台运行MapReduce程序
Hive架构
Hive的用户接口主要有三个: CLI, Client 和 WebUI. 其中最常用的是CLI, CLI启动的时候, 会同时启动一个Hive副本; Client是Hive的客户端, 用户通过连接Hive Server (Thrift Server)连接至Hive, 在启动Client模式时, 需要指出Hive Server所在节点,并且在该节点启动Hive Server; WUI是通过浏览器访问Hive.
Hive将元数据存储在数据库中, 如mysql、derby. Hive中的元数据包括表的名字, 表的列和分区及其属性, 表的属性(是否为外部表等), 表的数据所在目录等.
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成. 生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
Hive的数据存储在HDFS中, 大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
创建表:
Hive 内部表
CREATE TABLE [IF NOT EXISTS] table_name
删除表时,元数据与数据都会被删除
Hive 外部表 ----EXTERNAL
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name LOCATION hdfs_path
删除外部表只删除metastore的元数据,不删除hdfs中的表数据
1、结构一样,但是数据不一样 ----like
create table bws like te;
2、结构一样,数据也一样----as
create table bws2 as select * from tes;
Hive 查看表描述
DESCRIBE [EXTENDED|FORMATTED] table_name
extended
formatted
table-type:查看创建表的类型
补充:临时表
在当前进程中可以对数据进行相应的操作,但是退出hive时,就自动删除
create temporary table name-----一定是一张内部表
ROW FORMAT DELIMITED : 行格式分隔
FIELDS TERMINATED BY ’,’ : 字段之间使用空格分隔
COLLECTION ITEMS TERMINATED BY ‘-’ : 集合(就是这的数据)使用逗号分隔
MAP KEYS TERMINATED BY ‘:’ : 键值对使用冒号分隔
LINES TERMINATED BY ‘\n’ : 记录之间使用换行符分隔
上边的五句话有的可以不写,但是顺序必须按照这个顺序写
导入数据:
1、load data local inpath ‘/root/tes.txt’ into table test.usr;
将本地的数据导入到hive中
2、load data inpath ‘hdfs://node01:9000/user/tes.txt’ into table test.te;
从hdfs集群导入数据
LOAD DATA命令,可分为LOAD DATA LOCAL INPATH和LOAD DATA INPATH。两者的区别在于LOCAL
导入的是本地文件而不加LOCAL的导入的是HDFS文件—相当于直接将文件进行相应的上传
3、insert into—内外部表,不适应于分区
4、from table1
insert into(overwrite) tables2
select id ,name
Hive 分区partition(分成不同的文件目录进行存储)
静态分区:
必须在表定义时指定对应的partition字段-----分区字段一定不能与表中字段重复
a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt int);
上传数据:
load data local inpath ‘/root/tes.txt’ into table test.usr partition (age=10);
单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分
粗细力度分区的时候要根据业务需求,提前进行相应的设定 年月日时分秒----为了减少每一个
分区中的内容,提高计算效率
b、 双分区建表语句:
create table hour(id int, content string) partitioned by (dt int, hour int);
导入数据:
load data local inpath ‘/root/a.txt’ into table part1 partition (dt=10,age=20);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以dt为文件夹,再以hour子文件夹区分
增加分区
alter table hour add partition(dt=10,hour=40);
也就是说添加分区的时候不能直接添加,而是需要将原来的分区也要包含其中,完成相应的排序
删除分区
alter table tablename drop partition (sex=‘boy’)
alert table tablename drop partiton(dt=20,hour=40)
注:删除分区的时候,会将所有存在的分区都删除
动态分区:
动态分区要修改权限
修改权限的方式:
1、conf/hive-site.xml
2、在hive内部使用set进行相应的设置
3、hive启动的时候设置 hive --conf hive.exec.dynamic.partiton=true
1、修改权限
set hive.exec.dynamic.partiton=true //开启动态分区
2、修改默认状态
set hive.exec.dynamic.partiton.mode=nostrict //默认strict。至少有一个静态分区
创建分区表:
create table psn22(
id int,
name string,
likes array,
address map<string ,string>
)
partitioned by (age int ,sex string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ’,’
COLLECTION ITEMS TERMINATED BY ‘,’
MAP KEYS TERMINATED BY ‘:’
LINES TERMINATED BY ‘\t’
写入数据
from psn21 //已经存在的表格并且要有数据
insert overwrite table pas22 partiton (age,sex)
select * distribute by age,sex
分桶表:
测试数据
1,tom,11
开启分桶
set hive.enforce.bucketing=true
创建桶
create table psnbucket1 (
id int,
name string,
age int)
clustered by (age) into 4 buckets
row format delimited
fields terminated by ‘,’
加载数据
insert into table psnbucket select id,name,age from psn31
抽样
select * from bucket_table tablesample(bucket 1 out of 4 on colimes)
colimes是你的字段,例如age