导图社区 Hive数据类型、DDL数据知识点学习笔记
Hive 数据类型1、基本数据类型对于Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理..
编辑于2022-11-07 10:22:04 广东Hive数据类型、DDL数据知识点学习笔记
Hive基本概念
概念
是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能
本质是:将HQL转化成MapReduce程序
架构原理
图示
Hive与数据库的关系
查询语言
SQL
HQL
数据存储位置
数据库存在本地文件
Hive存在HDFS
数据更新
数据库读写并重
Hive读多写少
执行
数据库基于执行引擎
Hive基于Mapreduce
执行延迟
数据库数据量少时快
Hive数据量多时快
可扩展性
数据库由于ACID语义扩展性有限
Hive的可扩展性与Hadoop一致
数据规模
Hive保存元数据的方式
Single User Mode
默认使用derby保存,不可并发调用hive
User Mode
通过网络连接到数据库
Remote Server Mode
服务器端启动MetaStoreServer
Hive的数据类型
基本数据类型
集合数据类型
类型转换
隐式转换(自动类型转换)
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
DDL数据定义
数据库
增
删
改
查
表
增
删
改
查
DML数据操作
数据导入
数据导出
查询
函数
压缩和存储
压缩详见HDFS压缩
文件存储格式
主要格式
基于行格式
TextFile
默认格式,数据不做压缩,磁盘开销大,数据解析开销大
SequenceFile
二进制存储文件,在Hive中key为空,value存储具体值,避免排序
基于列格式
RCfile
面向列的数据格式,扫描HDFS Block的头部
ORCfile(Optimized Row Columnar)
每个stripe为HDFS块大小,其由Index Data,Row Data,Stripe Footer组成
Index Data
一个轻量级的index,默认是每隔1W行做一个索引
Row Data
存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream来存储
Stripe Footer
存的是各个Stream的类型,长度等信息
最终每个文件都有一个File Footer,里面存储Stripe的行数,Column的数据类型
图示
Parquet
Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。
行组(Row Group)
列块(Column Chunk)
页(Page)
图示
列式存储与行式存储
行式存储的特点
列式存储的特点
调优
Fetch抓取
做法:更改hive-default-xml中
hive.fetch.task.conversion
more
本地模式
做法:设置hive.exec.mode.local.auto
true
表的优化
小表大表的join
数据量小的置于左边
大表join大表
起因:某些key对应的数据太多,相同key发送到相同的reducer上
空key过滤
针对异常数据
操作
配置历史服务器
创建原始表
create table ori(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';
创建空id表
create table nullidtable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';
创建join后表的语句
create table jointable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';
设置过滤空id
空key转换
随机分布空null值
设置多个reduce数
set mapreduce.job.reduces = 5;
join两张表
insert overwrite table jointable select n.* from nullidtable n full join ori o on case when n.id is null then concat('hive', rand()) else n.id end = o.id;
MapJoin(小表join大表)
操作
自动选择Mapjoin
set hive.auto.convert.join = true;
大表小表的阈值设置
set hive.mapjoin.smalltable.filesize=25000000;
子主题 3
子主题 2
子主题 3
GroupBy
目的:防止数据倾斜
操作
开启Map端聚合参数设置
set hive.map.aggr = true
set hive.groupby.mapaggr.checkinterval = 100000
set hive.groupby.skewindata = true
Count(Distinct)
Count(Distinct)操作优先使用Group By再Count,因为Count Distinct即使设定了Reduce Task的个数,Hive也只启动reducer
笛卡尔积
避免join时不加on条件
行列过滤
行处理
子查询后再关联表
列处理
少用select *
动态分区调整
开启动态分区参数设置
hive.exec.dynamic.partition=true
hive.exec.dynamic.partition.mode=nonstrict
hive.exec.max.dynamic.partitions=1000
hive.exec.max.dynamic.partitions.pernode=100
在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
hive.exec.max.created.files=100000
分桶
分区
合理设置Map及Reduce个数
复杂文件增加Map数
小文件合并
合理设置reduce数
并行执行
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
严格模式
对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行
使用了order by语句的查询,要求必须使用limit语句
限制笛卡尔积的查询
JVM重用
Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。
推测执行
mapred-site.xml
mapreduce.map.speculative
mapreduce.reduce.speculative
hive.mapred.reduce.tasks.speculative.execution