hive按日期年月实现动态分区,分桶表创建

注意:分区和分桶都是按字段来组织数据的存放,分区是相同的字段值存放在一个文件中,而分桶是字段哈希值相同的数据存放在一个文件中。

 

目录

Hive分区分为静态分区和动态分区

概念

动态分区的属性:

hive动态分区

分桶表

hive读写模式:


 

目标:按照表中数据创建时间的年月来进行分区

Hive分区分为静态分区和动态分区

概念

静态分区:加载数据到指定分区的值。(按照固定的值进行分区:1,2,3就只分三个区)

动态分区:数据未知,根据分区的值来确定需要创建的分区。(当 4 出现的时候,就建立新的分区)

 

动态分区的属性:

 

参数名默认值描述
set hive.exec.dynamic.partition=truefalse设置true的时候为打开动态分区
set hive.exec.dynamic.partition.modestrict这个属性默认值是strict,就是要求分区字段必须有一个是静态的分区值,当前设置为nonstrict,那么可以全部动态分区
set hive.exec.max.dynamic.partitions.pernode100能被每个mapper或者reducer创建的最大动态分区的数目,如果一个mapper或者reducer试图创建多余这个值的动态分区数目会引发错误
set hive.exec.max.dynamic.partitions1000被一条带有动态分区的SQL语句所能创建的动态分区总量,总共的最大的动态分区数,如果超出限制会报错  
set hive.exec.max.created.files100000全局能被创建文件数目的最大值,专门有一个hadoop计数器来跟踪该值,如果超出会报错

 

静态分区是在语句中指定分区字段为某个固定值,动态分区就相对灵活的多。

一个分区实际上就是表下的一个目录,一个表可以在多个维度上进行分区,分区之间的关系就是目录树的关系。

 

hive动态分区

  1. 先将mysql表testtable用sqoop导入到hive中,采用自动建表的方式导入。(如果你的hive表已存在,这步可以忽略)
  2. 然后把建表语句拷出来(show create table testtable)
  3. 创建新表,字段不变修改表名添加年月分区字段,如下 
CREATE TABLE `testtable1`(
   `id` bigint, 
   `payorderno` string, 
   `tradeno` string, 
   `tradetype` int, 
   `goodsname` string, 
   `tradetime` bigint, 
   `storename` string, 
   `paymentuser` string, 
   `payway` int, 
   `tradeamount` string, 
   `refundno` string, 
   `servicecharge` string, 
   `remark` string, 
   `bankcode` string, 
   `thirdpayaccountid` string, 
   `creationtime` bigint)
 partitioned by (year int,month int)
 row format delimited fields terminated by '\t' 
 stored as parquetfile;

4.关闭严格分区模式

    动态分区模式是严格模式,也就是至少有一个静态分区。

 set hive.exec.dynamic.partition.mode=nonstrict	//分区模式,默认nostrict
 set hive.exec.dynamic.partition=true			//开启动态分区,默认true
 set hive.exec.max.dynamic.partitions=1000		//最大动态分区数,默认1000

在spark下可以通过config进行配置

    .config("hive.exec.dynamic.partition", True) \
    .config("hive.exec.dynamic.partition.mode", "nonstrict") \

5.然后根据时间动态分区,将数据插入到新表中,新表就实现分区了

creationtime为时间格式的转换

insert overwrite table testtable1 partition (year,month) 
 select *,year(creationtime) as year, month(creathiontime) as month
 from testtable;

creationtime为时间戳格式的转换(导入parquet格式时间格式默认是时间戳

insert overwrite table testtable1 partition(year,month) select
  *,from_unixtime(cast(createtime/1000 as int),'yyyy') as year,
 month(from_unixtime(cast(createtime/1000 as int),'yyyy-MM-dd HH:mm:ss')) 
 as month from testtable;

删除原表,分区表重命名

drop table testtable;
alter table testtable1 rename to testtable;

动态分区之后的数据存储路径,一个分区就是一个目录

在这里插入图片描述

分桶表

分桶是将某个字段取哈希值,哈希值相同的数据分发到一个桶中。
在创建分桶表的时候必须指定分桶的字段,和要分桶的数量。

创建分桶表SQL语句如下:

create table user_bucket( 
	userid int, 
	username string, 
	fullname string)
clustered by(userid) into 2 buckets  
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as parquetfile;

导入数据到user_bucket分桶表中的步骤:
设置使用分桶属性:

set hive.enforce.bucketing = true;

执行SQL语句

insert overwrite table user_bucket select userid,username,fullname from user;

hive读写模式:

Hive是一个严格的读时模式。 写数据不管数据正确性,读的时候,不对则用NULL替代。
mysql是一个的写时模式。 写的时候检查语法,不okay就会报错。

load data local inpath '/home/hivedata/t' into  table t_user;
insert into stu(id,sex) value(1,abc);

 

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中的分区分桶是用来提高查询性能和管理数据的两种技术。 分区是将数据按照某个列的值进行分区存储的。通过将数据分散存储在不同的分区中,可以减少查询时需要扫描的数据量,提高查询效率。创建分区的语法是使用ALTER TABLE语句,并指定分区的列和值。删除分区可以使用ALTER TABLE语句的DROP PARTITION子句。可以使用DESC FORMATTED命令查看分区的结构,使用SELECT语句查询分区的数据。\[1\] 分桶是将数据按照哈希函数的结果进行分桶存储的分桶可以提高数据的读取和查询效率,特别是在进行连接操作时。创建分桶的语法是使用CLUSTERED BY子句指定分桶的列,并使用INTO子句指定分桶的数量。可以使用INSERT INTO TABLE语句将数据导入分桶。\[2\] 在Hive 0.x和1.x版本中,需要设置hive.enforce.bucketing=true来强制分桶,以便程序可以根据结构自动选择正确数量的Reducer和cluster by column来进行分桶。可以使用CTAS语句将数据从一个复制到分桶中。\[3\] 总结起来,分区分桶都是用来提高查询性能和管理数据的技术,分区是按照某个列的值进行分区存储,而分桶是按照哈希函数的结果进行分桶存储。 #### 引用[.reference_title] - *1* *2* [大数据—Hive(七)_ 分区分桶](https://blog.csdn.net/m0_52968216/article/details/128667517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Hive分区分桶](https://blog.csdn.net/mxk4869/article/details/125635202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值