首页 > > > Hive 必知必会(一)
数据倾斜发生在shuffle阶段,如:

参数调节:
hive.map.aggr=true
Map 端部分聚合,相当于Combiner
第一,做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果
第二,
大小表join
工作原理是在Map端把小表加载到内存中,然后读取大表,和内存中的小表完成连接操作
手动map join
hive (hive)> select /*+mapjoin(post)*/ user.id,user.name,post.pid,post.title from user > join post
> on user.id = post.uid;
自动配置
hive (hive)> set hive.auto.convert.join=true;
hive (hive)> set hive.mapjoin.smalltable.filesize=25000000;(默认值就是25MB)
使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.
大表Join大表:
把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果
Hive 是为数据仓库而设计的
关键词:数据存储位置 查询语言 索引(hive不建立索引) 执行 可扩展性 数据规模
1. Hive 的数据都是存储在 HDFS 中的,数据库则将数据保存在 块设备 或者 本地文件系统 中
2.数据仓库的内容是读多写少的
3.Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
4.Hive 不适合在线数据查询
5.可以支持很大规模的数据
Sort By:每个MapReduce内部进行排序,对全局结果集来说不是排序。
Distribute By + Sort By : 分区 排序
#先按照部门编号分区,再按照员工编号降序排序。
hive (default)> set mapreduce.job.reduces=3;
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;Cluster By:
当distribute by和sorts by字段相同时 = cluster by , 但是只能倒序
元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等
2. 或者自身带的一个数据库derby
EXTERNAL关键字可以让用户创建一个外部表
在建表的同时指定一个指向实际数据的路径(LOCATION)
Hive创建内部表时,会将数据移动到数据仓库指向的路径
若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
7 请把下面语句用Hive实现
SELECT a.key,a.value
FROM a
WHERE a.key not in (SELECT b.key FROM b)1.语法
load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student [partition (partcol1=val1,…)];
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表(复制);否则从HDFS加载数据到hive表(移动)
(3)inpath:表示加载数据的路径
(4)overwrite into:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区load data inpath '/user/atguigu/hive/student.txt' overwrite into table default.student;
9 Hive自定义UDF函数的流程?
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore()
create temporary functionTextFile格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大
Parquet文件
是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的
把小表放在前面做关联可以提高效率
设置hive.fetch.task.conversion,就不走MapReduce
如上
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';可以
CREATE DATABASE IF NOT EXISTS TEST集合统计函数
1. 个数统计函数: count
2. 总和统计函数: sum
3. 平均值统计函数: avg
4. 最小值统计函数: min
5. 最大值统计函数: max
6. 非空集合总体变量函数:var_pop
7. 非空集合样本变量函数:var_samp
8. 总体标准偏离函数:stddev_pop
9.样本标准偏离函数:stddev_samp
10.中位数函数:percentile
11.似中位数函数:percentile_approx
12.直方图:histogram_numerichive最终都会转化为mapreduce的job来运行,要想hive调优,实际上就是mapreduce调优。
可以有下面几个方面的调优。
1.解决收据倾斜问题
2.减少job数量
3.设置合理的map和reduce个数
4.对小文件进行合并
5.优化时把握整体,单个task最优不如整体最优。
按照一定规则分区。
如上。
推荐:
1.海量数据算法面试大全
2.
Hadoop大数据面试题全版本,必看跳槽指南!_ITPUB博客
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/818/viewspace-3124418/ ,如需转载,请注明出处,否则将追究法律责任。