--hive分区、桶、倾斜
##marjs老师hive课程的听课笔记
1、分区,是粗粒度的
partition by (par_col par_type)
分类:静态分区,分区的值是确定的
动态分区,分区的值是不确定的,由输入的值决定 hive set hive.exec.dynamic.partition
分区字段是伪字段,不能与表定义字段重名
2、桶,是细粒度
clustered by,分桶,兼具distrubuted by和sort by的功能
每个reduce处理的数据不重叠,且reduce内的数据是排序的,达到全局有序
sort by,对同一reduce的数据按指定字段排序;
可指定执行的reduce个数
distributed by,按指定字段将数据划分到不同的输出reduce中(保证每个reduce数据不重叠)
分区内数据没有排序
3、倾斜表
skewed by(倾斜的列) on (倾斜的值)
eg:skewed by(userid) on(null) --在userid列存在null的数据倾斜
注意:前提,要知道在那个列那个值上有数据倾斜才能使用;
倾斜表是把倾斜特别严重的列分开存储为不同文件,每个倾斜的值指定为一个目录或一个文件,
因此在查询的时候,可以通过过滤倾斜来避免数据倾斜的问题
4、临时表,只能在当前会话中可见的表
create temporary table **
位置,在hdfs的tmp目录下
若创建的临时表与一个已存在的表,表名相同,那么在当前会话下,所有的操作都是对这个临时表的操作
局限性: 不支持分区
不支持索引
5、删除表
drop table **
内表,元数据信息和数据会一起被删除
垃圾箱在HDFS中已配置且没有指定PURGE时,数据被移动到.Transh/Current目录下,否则全部删除
PURGE,指定PURGE,删除表时,数据不会进入垃圾箱
外表,仅删除元数据,实际数据还在HDFS上
6、清空表
Truncate table**
partition_spec:
清空表或分区下的所有行,
被清空的表必须是内表,否则会抛出异常(外表不归hive管理所以无法完成清空)