Hive分区表,动态分区,分桶表

分区表

分区针对的是数据的存储路径;分桶针对的是数据文件

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的数据。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值