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;控制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.csdn.net/zhong_han_jun/article/details/50814246
在多个列上进行的去重操作与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会自动进行负载均衡。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中不支持对数据的改写和添加,所有的数据都是在加载的时候确定好的,而数据库中的数据通常是需要修改的
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
分区的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