分区表
分区针对的是数据的存储路径;分桶针对的是数据文件
1,静态分区:
(对已经分好类的文件导入静态分区)
create table tb_p_order(
oid int ,
dt string ,
cost double
)
partitioned by (mot string,day string)
row format delimited fields terminated by "," ;
实例:创建一个二级静态分区
导入数据:
load data local inpath "/opt2/06-18.txt" into table tb_p_order partition(mot='06',day='18');
06-18.txt
01,2020-06-18,200
02,2020-06-18,200
03,2020-06-18,100
03,2020-06-18,200
04,2020-06-18,200
05,2020-06-18,20
06,2020-06-18,100
07,2020-06-18,200
08,2020-06-18,200
09,2020-06-18,100
10,2020-06-18,200
查看效果:分到不同的文件夹下管理,二级分区就是二级文件夹,通过分区字段检查查询时间
2,动态分区:
根据查询的已存在hive中的数据的某个属性进行分区 ,就是动态分区。查询后动态导入建好的分区表
1,开启动态分区功能:
set hive.exec.dynamic.partition=true ;
set hive.exec.dynamic.partition.mode=nonstrick; 可以从普通表中导入数据
2,创建分区表:(和普通分区表创建没区别)
create table if not exists tb_p_user(
uid string ,
name string ,
age int ,
gender string ,
address string
)
partitioned by (addr string)
row format delimited fields terminated by " " ;
3,动态的从其他表中导入数据
插入数据的时候两张表字段类型个数一一对应。 最后一个字段就是分区字段 (其中tb_user就是普通表)
insert into tb_p_user partition(addr)
select uid , name , age , gender , address , address from tb_user ;
4,动态分区相关的设置参数
set hive.exec.dynamic.partition=true //使用动态分区
set hive.exec.dynamic.partition.mode=nonstrick;//无限制模式,如果模式是strict,则必须有一个静态分区且放在最前面
set hive.exec.max.dynamic.partitions.pernode=10000;//每个节点生成动态分区的最大个数
set hive.exec.max.dynamic.partitions=100000;//生成动态分区的最大个数
set hive.exec.max.created.files=150000;//一个任务最多可以创建的文件数目
set dfs.datanode.max.xcievers=8192;//限定一次最多打开的文件数
set hive.merge.mapfiles=true; //map端的结果进行合并
set mapred.reduce.tasks =20000; //设置reduce task个数
分桶表
好处:
1,更快,桶为表加上额外结构,连接相同列划分了桶的表,可以使用map-side join更加高效。(相当于MR的分区)
2,取样sampling更高效。没有分区的话需要扫描整个数据集。
创建分桶表:
1,开启分桶
set hive.enforce.bucketing=true;
2,创建分桶表,实例根据id分桶,分成四份
create table buck_demo(id int, name string)
clustered by(id) into 4 buckets;
3,测试,动态的从其他表中导入数据
insert into table buck_demo
select id, name from stu;
4,查看结果:导入的数据被分成四份
5,抽样数据:示例:拿出其中第二份
select * from buck_demo tablesample(bucket 2 out of 4 on id);
注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。
x表示从哪个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。例如,table总bucket数为4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2个bucket的数据,抽取第1(x)个和第3(x+y)个bucket的数据。