学习目标:
总结几点Hive的一些知识点
学习内容:
- hive源数据为何不放在内置derby数据库中?
一般会使用mysql作为源数据存储,内置的数据库主要是并发性能差,可以理解为单线程操作
- Hive中的四种排序
order by 属于全局排序,只有一个reduce
sort by 设置的reduce Task 大于1,只在每个输出reducer进行排序,不保证全局排序
distribute by 通常与sort by结合使用, 比如说对同一年份的温度进行排序,distribute by 是保证同一reducer接受到的是同一年份的数据,而sort by是对reducer中的数据进行排序
cluster by 当distribute by的字段和sort by 的字段相同的时候,可以用cluster by的方式,但排序只能升序
3.内部表和外部表
用external修饰得到的是外部表,删除表的时候只会删除源数据,不会删除hdfs的文件;而内部表的源数据存放在指定的位置,删除表会同时删除文件,内部表适合创建中间表
4.分区表和分桶表的区别
分区会在hdfs上创建物理目录;分桶可以在分区的基础上进行再次划分小表,实际为更加细颗粒的进行划分,还要指定桶的数量,依据表中真实的列,比如用户表根据name进行分桶,分为10个桶,然后会将name的hash值对10取模,按照取模的值将name分到10个桶里面
5.谈谈对hive的理解
hive是开源的基于hadoop的用于统计海量结构化数据的一个数据仓库,它定义了类似sql的语句,也就是类sql语句,换句话讲,Hive就是将hql语句转化成mapreduce过程的一个程序
6.hive的作用有哪些
将结构化数据文件映射出一张表,并提供类sql查询语句
7.hql和sql的区别
1.hql面向对象,sql面向数据库
2.hql 分大小写
3.Hql语句的数据类型除了基本数据类型外,还有其他的复杂的数据类型(如struct、map、array),而sql只有基本数据类型
4.hql语句不支持行级别的增、删、改,所有数据在加载时就以及确定,不可更改
5.hql不支持事务
8.hive模式设计
1.按天划分:在创建表时加入时间戳,在表名中加入时间
2.没有设置分区会全局查询,浪费资源
3.同一份数据,多种处理方式 从一个数据源产生多种数据聚合,而无需每次聚合都要重新扫描一遍
4.对于每个表的分区 有时对中间表的临时表进行分区,以避免任务失败,重新开始执行任务,或者某天某些数据被覆盖
5.分桶表的数据存储
6.使用列存储表使用age等这样的字段,也就是说字段重复比较多的表的属性,用列存储比较好。
9.数据倾斜
`首先了解数据倾斜产生的原因是什么,其实数据倾斜产生的原因很简单,某一条key的数据远远大于其他key中的数据。
解决办法:就是将某一节点中key的数据较多分散到其他的节点上。
(1)空值产生的数据倾斜
- 数值为空的不参与关联;
- 赋予空值新的key值;
(2)不同数据类型关联产生数据倾斜
如用户表中user_id的数据类型为int,log表中user_id的数据类型为String,两者相关联进行join操作时,默认是按照int进行关联的,String字符串的会分到同一个reducer中。
解决方法:进行数据类型转换
(3)大小表关联查询时产生数据倾斜
(4)小文件过多
小文件过多,需要合并小文件。
5)当HQL中包含count(distinct)
采用sum()group by的方式来替换count(distinct)完成合并。`