hive 分桶与便签:
1,分桶表是对列值进行 hash 的方式,将不同的数据放到不同的文件之中存储
2,对 hive中每一个表,分区都可以进行分桶
3,由列的hash值除以桶的个数来决定每条数据划分到哪个桶之中
4,适用于数据抽样,与 map-join
开启分桶机制
# 可以通过 mapred.reduce.tasks 设置 reduce 个数,不推荐 # 一次作业产生的桶(文件数量)和reduce task 个数一致 set hive.enforce.bucketing=true;
分桶表的查询:
''' tablesample(bucket x out of y on id) x:表示从哪个桶开始查询 y:表示桶的总数,一般为桶的总数的倍数或者因子。 如果y不是桶的总数的倍数或者因子,则会重新分桶查找数据 '''
常见 sql 语句:
/*创建原始表*/ create table students_1(id int,name string,age int) row format delimited fields terminated by ','; /*创建分区表*/ create table studentbuket_1(id int,name string,age int) clustered by (age) into 4 buckets row format delimited fields terminated by ','; /*加载数据到原始表*/ load data local inpath '/home/hadoop/data.txt' into table students_1; /*加载数据到分区表*/ insert into table studentbuket_1 select id,name,age from students_1; /*使用分桶查询 从第二个桶查找,以 4为增值进行相加*/ select id,name,age from studentbuket_1 tablesample(bucket 2 out of 4 on age)
hive 创建自定义函数(实现部分加密):
自定义临时函数(java):
package Day1; import org.apache.hadoop.hive.ql.exec.UDF; public class Hide1 extends UDF{ //重载 public String evaluate(final String input){ if(input==null){ return null; } String str =input.toString().substring(0,3)+"***"; return new String(str); } }
使用自定义函数:
1, 导入 jar包
2, 创建临时表(当前终端使用)并使用自定义函数
hive 便签以及优化:
1,为了执行效率考虑,简单的查询,就是只是select,不带count,sum,group by,都不走map/reduce,直接读取hdfs文件进行filter过滤
2, hive 启动默认是集群模式,可以配置本地模式(没有ui),集群模式不一定比 local快(资源分配)
3, hive 可以设置并行计算(没有依赖关系的子查询), 并行比串行要消耗几倍资源(与并行的个数有关)
4, hive 严格模式(可以提高查询效率):
1),order by 必须包含 limit 输出限制
2),对于分区表, 必须包含 limit 输出限制
5, hive 排序:
1),order by 对于查询结果做全排序,一个reduce处理(不适合数据量大)
2),sort by 对于单个 reduce 数据进行排序
3),distribute by 分区排序, 一般和 sort by使用
4),cluster by 相当于 sort by + distribute by
6, join 操作
1),将小表(驱动表)放在 join 左边
2),在 map 端完成 join 操作(小表放到内存之中)
3),大表join大表,reduce 负载均衡 1,根据key 进行分区, 删除失效的key,2,数据随机分配到 reduce之中
7, 设置map端聚合
8, 合并小文件
9, 设置 map(切片有关) 与 reduce(分区有关) 个数
#所有 sql 执行mapreduce 程序执行 set hive.fetch.task.conversion=none; # 查看执行计划 explain select * from students; # 配置hive 运行本地模式(调试,不走 yarn) set hive.exec.mode.local.auto=true; # 开启并行运行 set hive.exec.parallel=true; # 设置并行线程个数 set hive.exec.parallel.thread.number=8; # hive 开启严格模式 set hive.mapred.mode=strict; # 开启 自动 mapjoin set hive.auto.convert.join=true; # 开启 map 端聚合 set hive.map.aggr=true