hive 分区简单操作 + double 转int
目录
1、分区
2、double 转int
大数据难免要进行分区,这样可以方便针对性处理。
个人工作经历:我们将数据抽到hive后,会根据抽数日期对其进行分区,在建表时候就会添加分区字段
1、分区
create table if not exists 表名(
字段名 类型 comment'字段注释',
name string comment'姓名'
)
comment '表注释'
partitioned by (pt string) --分区字段 pt 类型string
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
STORED AS orc --格式
那么在导入数据的时候就会对一张表的指定分区插入数据
insert overwrite table 表名 partition(pt='${pt}') --待插入表
select
字段名
,name
from 表名 --数据源表
分区的作用相当于加了一个pt字段,方便增量抽取、后期补数、指定分析等,优点很多的。
2、double 转int 类型转换函数 cast(字段,目标类型)
分区有这么多的优点,与之带来的便捷和承担的责任有关,后期实际操作中遇到会持续跟新;下面描述一个需求+解决办法
产生需求的原因是新年的第一个月,需求部门会统计一些去年十二月数据录入源数据库并且这种操作不可避免,但是我们现有的补数任务是当天凌晨补前一天的数据,例如2021年1月1日会补2020年12月31日的数据,以此类推,所以这也导致在补数的时间后,对2020年12月31日添加的新数据就无法继续录入。所以我们将对牵扯的任务在每年的一月份对去年12月31日进行补数。
将需求归纳后,就是对上图导入的分区字段进行处理,对应关系
字段 | 原始数据(string) | 需求字段(string) |
pt | 20210102 | 20201231 |
pt | 20210103 | 20201231 |
思路:截取pt前四个字符获取当前年--a,a减去1得到去年--b,将b与1231拼接得需求字段,上测试代码
SELECT DISTINCT pt,concat(substr(pt,1,4)-1,1231) from 表名;--测试用的都是真实表,所以就把表名隐藏了
相信大家也看到了异常,substr(pt,1,4)-1 直接加减已经将结果变成了double类型,这种情况在实际开发中很常见,这时候就需要借助类型转换函数cast()将小数给去掉
SELECT DISTINCT pt,concat(cast(substr(pt,1,4)-1 as int),1231) from 表名;--可不要直接转string那样无法去掉小数点,换成术语讲就是将浮点型转换成整型就可去掉小数点
--cast(字段,数据类型) 将字段转换成后边的类型
这样就可实现我们想要的操作了,当然我们可以用时间函数来操作,但是对于这种是字符串的,来回转换比较耗费时间,上面的操作,简单粗暴硬道理!