1. HIVE日期函数基础入门
刚接触Hive处理日期数据时,最常遇到的几个问题就是:如何获取当前日期?怎么计算昨天的日期?时间戳和日期格式怎么互相转换?这些问题看似简单,但在实际业务场景中几乎每天都会用到。我在处理电商订单数据时就深有体会,每天都要跑日报统计,这些基础函数用得不熟练真的很耽误事。
先说说最常用的current_date()和current_timestamp()。这两个函数在Hive 1.2.0版本后引入,用起来特别方便。current_date()返回的是'yyyy-MM-dd'格式的当前日期,而current_timestamp()返回的是完整的'yyyy-MM-dd HH:mm:ss'格式。这里有个坑要注意:这两个函数获取的是查询开始执行时的时间,不是函数被调用时的时间。也就是说,如果你的查询要跑10分钟,期间多次调用current_date(),得到的都是同一个值。
-- 获取当前日期
SELECT current_date(); -- 输出:2024-03-15
-- 获取当前时间戳
SELECT current_timestamp(); -- 输出:2024-03-15 14:30:45
日期加减是另一个高频操作。Hive提供了date_add和date_sub函数,支持对日期进行加减操作。我在处理用户留存分析时,经常要用date_sub获取前几天的日期。比如要计算7日留存率,就需要用date_sub(current_date, 7)获取7天前的日期。
-- 获取昨天和明天的日期
SELECT date_sub(current_date(), 1); -- 昨天
SELECT date_add(current_date(), 1); -- 明天
-- 计算7天前的日期
SELECT date_sub(current_date(), 7); -- 7天前
2. 日期时间戳转换实战
时间戳和日期的转换是数据处理中的常见需求。Hive提供了from_unixtime和unix_timestamp这对黄金组合来处理这类问题。from_unixtime能把Unix时间戳转成可读的日期格式,而unix_timestamp则能把日期转成时间戳。
我在处理日志数据时,经常遇到时间戳是10位或13位数字的情况。这里要注意:Hive的from_unixtime默认处理的是秒级时间戳,如果是毫秒级需要先除以1000。有一次我忘了这个细节,结果转换出来的日期全部变成了1970年,闹了个大笑话。
-- 时间戳转日期(秒级时间戳)
SELECT from_unixtime(1678


9028

被折叠的 条评论
为什么被折叠?



