分区
分区列其实在表中并不存在,每个分区键为表的存储添加了一个目录,但是查询会返回这一列,即使数据文件中没有存储这个数据,相当于返回了目录名称。
切忌对表过度分区,这样会导致每个文件很小,从而导致hadoop存放较慢,而且分区会增加数据加载跟数据检索的开销。
分区表加字段必须使用casecade
参数
开启支持动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
默认:strict(至少有一个分区列是静态分区)
set hive.exec.max.dynamic.partitions:动态分区的上限,默认1000;
set hive.exec.max.dynamic.partitions.pernode 每个mapper/reducer节点可以创建的最大动态分区数,默认100;
分桶
适合于非常小的分区,分桶让你可以为每个表的分桶列定义桶的最大数据,每一个桶就是一个文件,分桶基于散列算法分割,提升join性能,只关联相同的桶。分桶不会为当前表建立一个虚拟列。
clustered by (列) into n buckets 将列的值用于散列函数分发到n个桶中去,如果分桶的列的值是非倾斜的,那么数据会均衡分布。
参数:
set hive.enforce.bucketing = true; 开启支持分桶,自动按照分桶表的bucket 进行分桶,运行时会根据bucket的个数自动分配reduce task个数
抽样语法
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
TABLESAMPLE语法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个bucket开始抽取数据
y:必须为该表总bucket数的倍数或因子 (Y表示相隔多少个桶再次抽取)
网友评论