1、strict严格模式
Hive配置中有个参数hive.mapred.mode,分为nonstrict,strict,默认是nonstrict
如果该模式值为strict,将会阻止以下三种查询:
(1)、对分区表查询,where中过滤字段不是分区字段。
(2)、笛卡尔积join查询,join查询语句,不带on条件或者where条件。
(3)、对order by查询,有order by的查询不带limit语句
一般来说,查询分区表时,一定会在where子句中加上分区条件,指明查看哪个分区的数据。否则会报错。因为默认set hive.mapred.mode=strict.即严格模式。
如果set hive.mapred.mode=nostrict.可以查询分区表时不带分区声明,这个时候会返回整张表的所有数据,即整张表各个分区的数据都会显示出来。这种实际很少使用,因为效率低。
2、动态分区参数设置
http://lxw1234.com/archives/2015/06/286.htm
hive.exec.dynamic.partition=True
hive.exec.dynamic.partition.mode=nonstrict #分区向表插入数据
hive.exec.max.dynamic.partitions.pernode 每个节点创建分区个数
hive.exec.max.dynamic.partitions 所有节点创建分区个数
hive.exec.max.created.files 创建文件
hive.error.on.empty.partition 空分区异常
-- Hive默认配置值
-- 开启或关闭动态分区
hive.exec.dynamic.partition=false;
-- 设置为nonstrict模式,让所有分区都动态配置,否则至少需要指定一个分区值
hive.exec.dynamic.partition.mode=strict;
-- 能被mapper或reducer创建的最大动态分区数,超出而报错
hive.exec.max.dynamic.partitions.pernode=100;
-- 一条带有动态分区SQL语句所能创建的最大动态分区总数,超过则报错
hive.exec.max.dynamic.partitions=1000;
-- 全局能被创建文件数目的最大值,通过Hadoop计数器跟踪,若超过则报错
hive.exec.max.created.files=100000;
3、hive中set等控制map和reduce数量
控制map和reduce的参数
set mapred.max.split.size=256000000; – 决定每个map处理的最大的文件大小,单位为B
set mapred.min.split.size.per.node=1; – 节点中可以处理的最小的文件大小
set mapred.min.split.size.per.rack=1; – 机架中可以处理的最小的文件大小
方法1
set mapred.reduce.tasks=10; – 设置reduce的数量
方法2
set hive.exec.reducers.bytes.per.reducer=1073741824 – 每个reduce处理的数据量,默认1GB
控制参数:https://blog.youkuaiyun.com/zhong_han_jun/article/details/50814246
4、负载均衡hive.groupby.skewindata
在多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在关系。
当hive.groupby.skewindata=true时,hive不支持多列上的去重操作
• hive.map.aggr = true 是否在 Map 端进行聚合,默认为True
• hive.groupby.mapaggr.checkinterval =100000 在 Map 端进行聚合操作的条目数目
• 有数据倾斜的时候进行负载均衡
• hive.groupby.skewindata = false 默认
• 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。
hive.groupby.skewindata变量:用于控制负载均衡的。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡。
5、Hive 执行过程概述
hql的mapreduce过程
https://www.cnblogs.com/qingyunzong/p/8847651.html
Hive特点
(1) Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后在Hadoop平台上运行,达到快速开发的目的。
(2) Hive本质是将HQL转化成Mapreduce程序
(3) Hive中的表是纯逻辑表,只有表的定义等,即表的元数据。本质就是Hadoop的目录/文件,达到了元数据与数据存储分离的目的.
(4) Hive本身不存储数据,它完全依赖HDFS和MapReduce。
(5) Hive的内容是读多写少,不支持对数据的改写和删除。
(6) Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:
- 行分隔符:空格、\t、\001
- 列分隔符:\n
- 文件格式:TextFile、SequenceFile、RCFile
Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候确定好的,而数据库中的数据通常是需要修改的
6、reduce
1、order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)会导致当输入规模较大时,需要较长的计算时间。
与数据库中 order by 的区别在于在hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。
2、sort by只保证每个reducer的输出有序,不保证全局有序。
可以指定执行的reduce 个数 (set mapred.reduce.tasks=) 这样可以输出更多的数据。
对输出的数据再执行归并排序,即可以得到全部结果。
3、 distribute by
按照指定的字段对数据进行划分到不同的输出reduce / 文件中。根据name的长度划分到不同的reduce中,最终输出到不同的文件中
insert overwrite local directory ‘/home/hadoop/out’ select * from test order by name distribute by length(name);
4、 Cluster By
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。倒序排序,且不能指定排序规则。 asc 或者 desc
7、优缺点
优点:
1、可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务 横向扩展:通过分担压力的方式扩展集群的规模 纵向扩展:一台服务器cpu i7-6700k 4核心8线程,8核心16线程,内存64G => 128G
2、延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
3、良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行
缺点:
1、Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结 果导入到文件中(当前选择的 hive-2.3.2 的版本支持记录级别的插入操作)
2、Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能 用在交互查询系统中。
3、Hive 不支持事务(因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而 不是 OLTP(联机事务处理),这就是数据处理的两大级别)
8、数据特点和使用
分区的Hive表,每个分区下都是很多个小文件而不是大文件*。所以选取小时下的所有文件还要 day/hour/*
需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前,即也在having之前。
3.where后的条件表达式里不允许使用聚合函数(count(),sum(),avg(),max(),min()),而having可以。
四、当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where --group by---having --order by
9、注释+数据类型
单行注释:--
多行注释:/*......*/
2、real数据类型
real型数据的存储大小为4个字节,可精确到小数点后第7位数字。
这种数据类型的数据存储范围为从-3.40E+38~-1.18E-38,0和1.18E-38~3.40E+38。
在MSSQL中real的同义词是float,用法几乎一样
3、float数据类型
float型的数据存储大小为8个字节,可精确到小数点后15位数字。