Hive 是什么? Hive 是建立在 Hadoop 上的数据仓库。通俗的说,数据仓库就是用来作为查询 分析的数据库,很少用来插入,修改,删除 当前我们使用的hive版本是2.5.3.0-37
hive中的基本数据类型
数值型:tinyint、smallint、int、integer、bigint、float、double、decimal
日期类型:timestamp(纳秒级时间戳) DATE(YYYY-MM-DD)
字符串类型 string varchar char
布尔类型 boolean(使用较少)
字节数组 binary
复杂数据类型 STRUCT、MAP、ARRAY
复杂数据类型的使用:
(1)STRUCT
CREATE TABLE student_test(id INT, info struct<name:STRING, age:INT>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':';
'FIELDS TERMINATED BY',':字段与字段之间的分隔符,''COLLECTION ITEMS TERMINATED BY' :一个字段各个item的分隔符
(2)ARRAY
建表
create table class_test(name string, student_id_list array<INT>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':';
设置了一个int型数组,数组里的元素用:分隔
(3)MAP
create table employee(id string, perf map<string, int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'//字段之间的分隔符
COLLECTION ITEMS TERMINATED BY ','//指定map里的每组元素之间的元素分隔符
MAP KEYS TERMINATED BY ':'; //指定map和key的分隔符
hive中的数据文件格式和压缩格式
文件格式
面向行/ 列类型 | 类型名称 | 是否可切割计算 | 优点 | 缺点 | 适用场景 |
面向行 | 文本文件格 式(.txt) | 可以 | 查看、编辑简单 | 无压缩占空间 大、传输压力 大、数据解析 开销大 | 学习练习 使用 |
面向行 | SequenceFil e 序列文件格 式(.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(.sn appy) | 不可切分 | 否 | 高速压缩/解压 速度 合理的压缩率 | 压缩率比 gzip 低 不原生、 需要 native 安 装 | 适合作为 map- >reduce 或是 job 数据流的中 间数据传输格式 |
数据操作分类
DDL:建表删表修改表结构,创建删除视图,创建数据库,显示命令(Create/Drop/Alter Database, Create/Drop/Truncate Table, Alter Table/Partition/Column, Create/Drop/Alter View, Create/Drop Index, Create/Drop Function, Show Describe)
ddl中要注意内表和外表的区别,
内表:元数据和数据本身均被 hive 管理。删除表则全部删除。
外表:元数据被 hive 管理,数据本身存储在 hdfs,不受 hive 管理。 删除表则只删除元数据,数据本身不变,创建外表时在table前加 external
分区 伪列,并不是真正的字段,从hdfs上看,分区是一个文件路径。大部分分区字段都是日期
分桶 根据选定的字段的hash值来划定分桶,不是伪列,使用真实的字段
虚表:
row format:用于设定行、列、集合的分隔符等设置
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 '\001'
LINES TERMINATED BY '\n'
STORED AS textfile;
DML:数据插入(insert,load) load data ... into table,insert overwrite table
DQL:数据查询(select) join
区分 inner join取两表交集;left join保留左表全部数据,右表没有与之对应的就置为NULL,right join与之相反;full outer join将两表数据全部保留。
hive不支持update和delete
hive的内置函数:聚合函数如sum、avg、max、min、count等。处于效率考虑,进行行数统计时使用count(1)而不是count(*)
字符串函数 reverse、trim 、split等split的用法split("a,b,c",","),其返回值是一个数组
表生成函数explode。常与later view连用形成新表
分析函数:NTILE:序列分析函数,用于数据分片排序,对数据分片并返回当前分片 值。(即对数据集分块,如第 1 块,第 2 块 等),不均匀的时候,依次增 加前边分片序列的数量
ROW_NUMBER:序列分析函数,用于排序,按照顺序,不关心是否有相等 情况,从 1 开始逐条给数据一个加 1 后 的序列号。如 1,2,3,4....
RANK:序列分析函数,用于排序,按照顺序,关心相等情况,如遇到相 等情况,名次会留下空位。1,2,2,4,4,6......
DENSE_RANK:DENSE_RANK:序列分析函数,用于排序,关心相等情况,如遇到相等情 况,名次不会留下位。 如 1,2,2,3,3,4......
CUME_DIST:累计计算函数,计算公式为“小于等于当前值的行数/分组 内总行数",用于计算数据分布等场景。
PERCENT_RANK:累计计算函数,计算公式为” 分组内当前行的 RANK 值1/分组内总行数-1",用于计算处理进度等 场景。
OVER() 从句和GROUP BY over与聚合函数连用指定分析窗口函数的细化落围规则
hive的基本架构设计,如图
Hive的自定义函数
1、udf (user define function) 实现的是输入输出1:1
创建自定义UDF的步骤:(1) 自定义java类(2)继承UDF类 (3)重写evaluate方法(4)maven打包 (5)add jar(6)使用create function创建临时函数(6)调用该udf函数
例如 实现输入的字符串两位后的全部都由*代替
package com.tianliangedu.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
* 功能:实现当输入字符串超过 2 个字符的时候,多余的字符以"..."来表示。
* 输入/输出:* 如“12”则返回“12”,如“123”返回“12..."
*/
public class ValueMaskUDF extends UDF{
public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
if(input.length()<=maxSaveStringLength){
return input;
}
return input.substring(0,maxSaveStringLength)+replaceSign;
}
public static void main(String[] args) {
System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));;
}
}
采取maven管理打包方式,相应的pom配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http:
//maven.apache.org/xsd/maven-4.0.0.xsd";>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianliangedu.course</groupId>
<artifactId>TlHadoopCore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像 -->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<dependencies>
<!-- 引入 hadoop-cli-2.7.4 依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-cli</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>TlHadoopCore</finalName>
<plugins>
<plugin>
<artifactId>maven-assemblyplugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-withdependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compilerplugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
maven打包后上传到目的路径里,命令是add jar jar包的路径,然后声明函数 create temporary function 函数名 as ‘包名.类名’;然后像使用系统函数一样,用select语句使用就行了。
2、udaf(user defined aggregation function) 作用相当于聚合函数
继承UDAF类
hive中的一些重要参数
名称设置类 mapred.job.name=JobName 任务在执行时的名称
资源限制类:mapred.reduce.tasks=reduceNum 设置reduce个数
mapred.map.task=mapNumber 设置map的个数
hive.exec.reducers.max 设置最大可用的reduce个数
性能优化类 hive.e
性能优化-本地化 hive.map.aggr
性能优化-数据倾斜类 hive.map.aggr 本地化的一个方法,
hive.groupby.mapaggr.checkinterval 在map端开启聚合combiner,减少网络传输 减少数据倾斜的发生
hive参数的使用方式:1、配置文件设置。2、通过在进入hive cli时指定配置参数。3、进入hive cli后,通过set来设定也是session级参数,比较常见。4、通过shell脚本调用hive -e做参数设置和脚本执行,生产环境采用最多
数据架构 分为三层,源数据落地区(SDF),数据仓库区(DW),数据集市区(DM)
hive使用的引擎各自特点:1、配置mapreduce计算引擎set hive.execution.engine=mr; 2、配置spark计算引擎set hive.execution.engine=spark;3、配置tez 计算引擎set hive.execution.engine=tez;
MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,非常适合数据密集型计算。
Spark:Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。
Tez: 是基于Hadoop Yarn之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。它把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。同时合理组合其子过程,也可以减少任务的运行时间
Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少),从而大大提升DAG作业的性能