Hive架构设计原理
一. Hive基本使用
直接输入hive回车,进入hive cli
常用命令使用
查看数据库:show databases;
创建数据库:create database tianliangedu;
选择数据库:use tianliangedu;
查看某个数据库下的所有表:show tables;
创建表:create table userinfo(id int,username string);
向表中插入数据:insert into userinfor values(1,'sss')
查询数据表中的数据:select * from...
删除一个表: drop table 表名称
上述使用方法与mysql类似
删除hive cli 会话:老版本:exit,新版本:!exit
使用总结:简单,面向数据和业务编程
二.Hive架构设计
特别说明:hive2.2以后版本变化较大,去掉了HWI模块,HiveCLI模式也直接采用了beeline链接。
三. Hive运行流程详解
Hive基础概念
1.Hive数据模型
2.数据类型
数值型
类型 | 说明 |
TINYINT | 1-byte signed integer from -128 to 127 |
SMALLINT | 2-byte signed integer from -32,768 to 32,767 |
INT INTEGER | 4-byte signed integer from -2,147,483,648 to 2,147,483,647 |
BIGINT | 8-byte signed integer from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
FLOAT | 4-byte single precision floating point number |
DOUBLE | 8-byte double precision floating point number PRECISION |
DECIMAL | Decimal datatype was introduced in Hive0.11.0 (HIVE-2693) and revised in Hive 0.13.0 (HIVE-3976) |
日期类型
类型 | 说明 |
TIMESTAMP | UNIX时间戳和可选的纳秒精度 |
DATE | 描述特定的年/月/日,格式为YYYY-MM-DD |
字符串
类型 | 说明 |
string | 最常用的字符串格式,等同于java String |
varchar | 变长字符串,hive用的较多,最长为65535 |
char | 定长字符串,比varchar更多一些,一般不要超过255个字符 |
布尔类型
类型 | 说明 |
boolean | 等同于java的boolean用的很少 |
字节数组
类型 | 说明 |
binary | 字节数组类型,可以存储任意类型的数据用的很少 |
复杂(集合)数据类型
数据类型 | 描述 | 字面语法示例 |
STRUCT | 和C语言中的struct或者”对象”类似,都可以通过”点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, lastdt STRING},那么第1个元素可以通过字段名.first来引用 | struct( ‘John’, ‘Doe’) |
MAP | MAP是一组键-值对元组集合,使用数组表示法(例如[‘key’])可以访问元素。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取值’Doe’ | map(‘first’, ‘John’, ‘last’, ‘Doe’) |
ARRAY | 数组是一组具有相同类型的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第1个元素可以通过数组名[0]进行引用 | ARRAY( ‘John’, ‘Doe’) |
3.Hive数据文件格式和压缩格式
- 文件格式
文件格式按面向的存储形式不同,分为面向行和面向列两大类文件格式。
面向行/列类型 | 类型名称 | 是否可切割计算 | 优点 | 缺点 | 适用场景 |
面向行 | 文本文件格式(.txt) | 可以 | 查看、编辑简单 | 无压缩占空间大、传输压力大、数据解析开销大 | 学习练习使用 |
面向行 | SequenceFile序列文件格式(.seq) | 可以 | 自支持、二进制kv存储、支持行和块压缩 | 本地查看不方便:小文件合并成kv结构后不易查看内部数据 | 生产环境使用、map输出的默认文件格式 |
面向列 | rcfile文件格式(.rc) | 可以 | 数据加载快、查询快、空间利用率高、高负载能力 | 每一项都不是最高 | 学习、生产均可 |
面向列 | orcfile文件格式(.orc) | 可以 | 兼具rcfile优点、进一步提高了读取、存储效率、新数据类型的支持 | 每一项都不是最高 | 学习、生产均可 |
- 压缩格式
压缩格式按其可切分独立性,分成可切分和不可切分两种。
可切分性 | 类型名称 | 是否原生支持 | 优点 | 缺点 | 适用场景 |
可切分 | lzo(.lzo) | 否 | 压缩/解压速度快 合理的压缩率 | 压缩率比gzip低 不原生、需要native安装 | 单个文件越大,lzo优点越越明显。压缩完成后>=200M为宜 |
可切分 | bzip2(.bz2) | 是 | 高压缩率超过gzip 原生支持、不需要native安装、用linux bzip可解压操作 | 压缩/解压速率慢 | 处理速度要求不高、要求高压缩率(冷数据处理经常使用) |
不可切分 | gzip(.gz) | 是 | 压缩/解压速度快 原生/native都支持使用方便 | 不可切分、对CPU要求较高 | 压缩完成后<=130M的文件适宜 |
不可切分 | snappy(.snappy) | 否 | 高速压缩/解压速度 合理的压缩率 | 压缩率比gzip低 不原生、需要native安装 | 适合作为map->reduce或是job数据流的中间数据传输格式 |
4.数据操作分类
操作分类 | 具体操作 | sql备注 |
DDL | •建表 •删除表 •修改表结构 •创建/删除视图 •创建数据库 •显示命令 | Create/Drop/Alter Database Create/Drop/Truncate Table Alter Table/Partition/Column Create/Drop/Alter View Create/Drop Index Create/Drop Function Show functions; Describe function; |
DML | •数据插入(insert,load) | load data...into table insert overwrite table |
DQL | •数据查询(select) |
四.HiveSQL
1.DDL
external: 创建内部表还是外部表,此为内外表的唯一区分关键字。
- comment col_comment: 给字段添加注释
- comment table_comment: 给表本身添加注释
- partitioned by: 按哪些字段分区,可以是一个,也可以是多个
- clustered by col_name... into num_buckets BUCKETS:按哪几个字段做hash后分桶存储
- row format:用于设定行、列、集合的分隔符等设置
- stored as : 用于指定存储的文件类型,如text,rcfile等
- location : 设定该表存储的hdfs目录,如果不手动设定,则采用hive默认的存储路径
- 查看已存在表的详细信息
show create table或者desc tablename/desc formatted tablename
- 更改表
- 增加字段
- 创建视图(虚表)
视图:本身不存储实际数据,只存储表关系,使用时再去通过关系查找数据。
查看所有视图:show views;
- 删除视图
2.DML
(1)加载数据脚本
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
(2)加载本地数据文件
创建一个文本文件存储的表,并以"\t"作为分隔符,方便构造和上传数据
CREATE TABLE student(
id string comment '学号',
username string comment '姓名',
classid int comment '班级id',
classname string comment '班级名称'
)
comment '学生信息主表'
partitioned by (come_date string comment '按入学年份分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS textfile;
将本地数据文件加载到表中 LOAD DATA local INPATH './student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170903);
通过SELECT查看表中是否加载了数据
(3) 加载HDFS数据文件
将之前的本地文件上传至自己的hdfs目录中
hdfs dfs -copyFromLocal student.txt /tmp/tianliangedu/input_student_info/
加载HDFS数据文件的脚本
LOAD DATA INPATH '/tmp/tianliangedu/input_student_info/student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170904);
通过SELECT查看表中是否加载了数据
SELECT * FROM STUDENT;
(4)将查询结果插入到数据表中
脚本模板
INSERT OVERWRITE TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)]
select_statement1 FROM from_statement
- 样例
insert overwrite table student partition(come_date='20170904')
select
id,username,classid,classname
from student
where come_date='20170903';
通过SELECT查看表中是否插入了数据
(5)多插入模式(一次查询多次插入)
- 模板
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol=val)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2
...
- 样例
from student
insert overwrite table student partition(come_date='20170905') select id,username,classid,classname where come_date='20170904'
insert overwrite table student partition(come_date='20170906') select id,username,classid,classname where come_date='20170904'
insert overwrite table student partition(come_date='20170907') select id,username,classid,classname where come_date='20170904'
面向分析和面向事务的处理
面向分析要准,但不要快
面向事务要快
DAG
Directed Acycle Graph,有向无环图
Yarn-tez 模式
为什么抛弃掉mr?
因为mr一个是计算效率太慢,一个是启动时间太慢
为什么选择了tez
第一是优化了计算效率,DAG效率优化
第二是优化了应用的启动响应时间
使用代理机制优化
编程抽象的等级划分
面向二进制机器码编程
面向机器指令编程-汇编
面向过程-C语言
面向对象-Java语言
面向函数-函数式编程-js、scala、r语言
面向数据编程-SQL
面向自然语言编程-说人话就可以实现编程
嵌入式数据库
随着具体的代码应用而伴随运行的组件,即称为嵌入式组件
其中嵌入式数据库是最典型的应用之一
Derby
Sqllite
Berkerly db
Varchar和char对比
相同点
多是存储数据的类型
差异点
Varchar是变长
节省存储空间,不利于计算
用时间换空间
Char是定长
浪费了存储空间,节省了计算时间
用空间换时间
请介绍一下hive的内外表
概念说明
hive将表的分类共2类,即内外表
以元数据和实体数据的操作权限作为分类依据
特点特征
内表:元数据和实体数据全归hive管理,一删全删
外表:元数据归hive管理,实体数据不归hive管理,而是归hdfs,删表的话,只会删除 Hive元数据,不会改变实体数据
应用场景
数据表生成时,如果时hive内部自生成的,而是外部导入,则设置外表
代码实现
Create [external] table......
请介绍一下hive当中的试图view
概念说明
hive当中对数据表数据即关系的一种抽象,称为视图.
特点特征
虚表,只存关系,不存实际的数据.但是通过他可以查询出来对应的数据
应用场景
解耦
解真实用户和各个不同关系的藕
将复杂的表关系抽象出来,形成一个虚表,相当于将表关系进一步抽象
当这个复杂表关系需要反复利用时,应该使用视图
代码实现
Create view ......
请介绍一下hive的表区分作用
概念介绍
表结构当中为了提升查询效率而设计的一个水平切分数据的虚字段,成为分区
特点特征
虚字段的设计,并不占用表结构对应的实体数据
其每个分区值对应的hive表当中hdfs存储的一个物理目录
应用场景
数据量较大、且具备明显的水平可切分字段,均可使用
比如日期、位置、国家等区域性 明显的可枚举的顿号品牌名称等可枚举字段
代码实现
Create table ......partitioned by col comment '' ......
数据上报
\ 各平台型公司或是公司自有线上平台,会将访问或是用户在该平台上的各项用户行业通过web前端收集数据,并发送数据到后台的数据收集方,完成平台用户的收集任务.此过程统称为数据上报.