在Hive的開窗函數實戰的文章中,主要介紹了Hive的分析函數的基本使用。本文是這篇文章的延續,涵蓋了Hive所有的條件函數和日期函數,對於每個函數,本文都給出了具體的解釋和使用案例,方便在工作中查閱。
條件函數
assert_true(BOOLEAN condition)
- 解釋
如果condition不為true,則拋出異常,否則返回null
- 使用案例
select assert_true(1<2) -- 返回null
select assert_true(1>2) -- 拋出異常
coalesce(T v1, T v2, …)
- 解釋
返回第一個不為null的值,如果都為null,則返回null
- 使用案例
select coalesce(null,1,2,null) -- 返回1
select coalesce(1,null) -- 返回1
select coalesce(null,null) -- 返回null
if(BOOLEAN testCondition, T valueTrue, T valueFalseOrNull)
- 解釋
如果testCondition條件為true,則返回第一個值,否則返回第二個值
- 使用案例
select if(1 is null,0,1) -- 返回1
select if(null is null,0,1) -- 返回0
isnotnull(a)
- 解釋
如果參數a不為null,則返回true,否則返回false
- 使用案例
select isnotnull(1) -- 返回true
select isnotnull(null) -- 返回false
isnull(a)
- 解釋
與isnotnull相反,如果參數a為null,則返回true,否則返回false
- 使用案例
select isnull(null) -- 返回true
select isnull(1) -- 返回false
nullif(a, b)
- 解釋
如果參數a=b,返回null,否則返回a值(Hive2.2.0版本)
- 使用案例
select nullif(1,2) -- 返回1
select nullif(1,1) -- 返回null
nvl(T value, T default_value)
- 解釋
如果value的值為null,則返回default_value默認值,否則返回value的值。在null值判斷時,可以使用if函數給定默認值,也可以使用此函數給定默認值,使用該函數sql特別簡潔。
- 使用案例
select nvl(1,0) -- 返回1
select nvl(null,0) -- 返回0
日期函數
add_months(DATE|STRING|TIMESTAMP start_date, INT num_months)
- 解釋
start_date參數可以是string, date 或者timestamp類型,num_months參數時int類型。返回一個日期,該日期是在start_date基礎之上加上num_months個月,即start_date之后null_months個月的一個日期。如果start_date的時間部分的數據會被忽略。注意:如果start_date所在月份的天數大於結果日期月的天數,則返回結果月的最后一天的日期。
- 使用案例
select add_months("2020-05-20",2); -- 返回2020-07-20
select add_months("2020-05-20",8); -- 返回2021-01-20
select add_months("2020-05-31",1); -- 返回2020-06-30,5月有31天,6月只有30天,所以返回下一個月的最后一天
current_date
- 解釋
返回查詢時刻的當前日期
- 使用案例
select current_date() -- 返回當前查詢日期2020-05-20
current_timestamp()
- 解釋
返回查詢時刻的當前時間
- 使用案例
select current_timestamp() -- 2020-05-20 14:40:47.273
datediff(STRING enddate, STRING startdate)
- 解釋
返回開始日期startdate與結束日期enddate之前相差的天數
- 使用案例
select datediff("2020-05-20","2020-05-21"); -- 返回-1
select datediff("2020-05-21","2020-05-20"); -- 返回1
date_add(DATE startdate, INT days)
- 解釋
在startdate基礎上加上幾天,然后返回加上幾天之后的一個日期
- 使用案例
select date_add("2020-05-20",1); -- 返回2020-05-21,1表示加1天
select date_add("2020-05-20",-1); -- 返回2020-05-19,-1表示減一天
date_sub(DATE startdate, INT days)
- 解釋
在startdate基礎上減去幾天,然后返回減去幾天之后的一個日期,功能與date_add很類似
- 使用案例
select date_sub("2020-05-20",1); -- 返回2020-05-19,1表示減1天
select date_sub("2020-05-20",-1); -- 返回2020-05-21,-1表示加1天
date_format(DATE|TIMESTAMP|STRING ts, STRING fmt)
- 解釋
將date/timestamp/string類型的值轉換為一個具體格式化的字符串。支持java的SimpleDateFormat格式,第二個參數fmt必須是一個常量
- 使用案例
select date_format('2020-05-20', 'yyyy'); -- 返回2020
select date_format('2020-05-20', 'MM'); -- 返回05
select date_format('2020-05-20', 'dd'); -- 返回20
-- 返回2020年05月20日 00時00分00秒
select date_format('2020-05-20', 'yyyy年MM月dd日 HH時mm分ss秒') ;
select date_format('2020-05-20', 'yy/MM/dd') -- 返回 20/05/20
dayofmonth(STRING date)
- 解釋
返回一個日期或時間的天,與day()函數功能相同
- 使用案例
select dayofmonth('2020-05-20') -- 返回20
extract(field FROM source)
- 解釋
提取 day, dayofweek, hour, minute, month, quarter, second, week 或者year的值,field可以選擇day, dayofweek, hour, minute, month, quarter, second, week 或者year,source必須是一個date、timestamp或者可以轉為 date 、timestamp的字符串。注意:Hive 2.2.0版本之后支持該函數
- 使用案例
select extract(year from '2020-05-20 15:21:34.467'); -- 返回2020,年
select extract(quarter from '2020-05-20 15:21:34.467'); -- 返回2,季度
select extract(month from '2020-05-20 15:21:34.467'); -- 返回05,月份
select extract(week from '2020-05-20 15:21:34.467'); -- 返回21,同weekofyear,一年中的第幾周
select extract(dayofweek from '2020-05-20 15:21:34.467'); -- 返回4,代表星期三
select extract(day from '2020-05-20 15:21:34.467'); -- 返回20,天
select extract(hour from '2020-05-20 15:21:34.467'); -- 返回15,小時
select extract(minute from '2020-05-20 15:21:34.467'); -- 返回21,分鍾
select extract(second from '2020-05-20 15:21:34.467'); -- 返回34,秒
year(STRING date)
- 解釋
返回時間的年份,可以用extract函數替代
- 使用案例
select year('2020-05-20 15:21:34'); -- 返回2020
quarter(DATE|TIMESTAMP|STRING a)
- 解釋
返回給定時間或日期的季度,1至4個季度,可以用extract函數替代
- 使用案例
select quarter('2020-05-20 15:21:34'); -- 返回2,第2季度
month(STRING date)
- 解釋
返回時間的月份,可以用extract函數替代
- 使用案例
select month('2020-05-20 15:21:34') -- 返回5
day(STRING date),
- 解釋
返回一個日期或者時間的天,可以用extract函數替代
- 使用案例
select day("2020-05-20"); -- 返回20
select day("2020-05-20 15:05:27.5"); -- 返回20
hour(STRING date)
- 解釋
返回一個時間的小時,可以用extract函數替代
- 使用案例
select hour('2020-05-20 15:21:34');-- 返回15
minute(STRING date)
- 解釋
返回一個時間的分鍾值,可以用extract函數替代
- 使用案例
select minute('2020-05-20 15:21:34'); -- 返回21
second(STRING date)
- 解釋
返回一個時間的秒,可以用extract函數替代
- 使用案例
select second('2020-05-20 15:21:34'); --返回34
from_unixtime(BIGINT unixtime [, STRING format])
- 解釋
將將Unix時間戳轉換為字符串格式的時間(比如yyyy-MM-dd HH:mm:ss格式)
- 使用案例
select from_unixtime(1589960708); -- 返回2020-05-20 15:45:08
select from_unixtime(1589960708, 'yyyy-MM-dd hh:mm:ss'); -- -- 返回2020-05-20 15:45:08
select from_unixtime(1589960708, 'yyyy-MM-dd'); -- 返回2020-05-20
from_utc_timestamp(T a, STRING timezone)
- 解釋
轉換為特定時區的時間
- 使用案例
select from_utc_timestamp('2020-05-20 15:21:34','PST'); -- 返回2020-05-20 08:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','GMT'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','UTC'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','DST'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','CST'); -- 返回2020-05-20 10:21:34.0
last_day(STRING date)
- 解釋
返回給定時間或日期所在月的最后一天,參數可以是’yyyy-MM-dd HH:mm:ss’ 或者 'yyyy-MM-dd’類型,時間部分會被忽略
- 使用案例
select last_day('2020-05-20 15:21:34'); -- 返回2020-05-31
select last_day('2020-05-20'); -- 返回2020-05-31
to_date(STRING timestamp)
- 解釋
返回一個字符串時間的日期部分,去掉時間部分,2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date
- 使用案例
select to_date('2020-05-20 15:21:34'); -- 返回2020-05-20
select to_date('2020-05-20'); -- 返回2020-05-20
to_utc_timestamp(T a, STRING timezone)
- 解釋
轉換為世界標准時間UTC的時間戳,與from_utc_timestamp類似
- 使用案例
select to_utc_timestamp('2020-05-20 15:21:34', 'GMT'); -- 返回2020-05-20 15:21:34.0
trunc(STRING date, STRING format)
- 解釋
截斷日期到指定的日期精度,僅支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY)
- 使用案例
select trunc('2020-05-20', 'YY'); -- 返回2020-01-01,返回年的1月1日
select trunc('2020-05-20', 'MM'); -- 返回2020-05-01,返回月的第一天
select trunc('2020-05-20 15:21:34', 'MM'); -- 返回2020-05-01
unix_timestamp([STRING date [, STRING pattern]])
- 解釋
參數時可選的,當參數為空時,返回當前Unix是時間戳,精確到秒。可以指定一個具體的日期,轉換為Unix時間戳格式
- 使用案例
-- 返回1589959294
select unix_timestamp('2020-05-20 15:21:34','yyyy-MM-dd hh:mm:ss');
-- 返回1589904000
select unix_timestamp('2020-05-20','yyyy-MM-dd');
weekofyear(STRING date)
- 解釋
返回一個日期或時間在一年中的第幾周,可以用extract替代
- 使用案例
select weekofyear('2020-05-20 15:21:34'); -- 返回21,第21周
select weekofyear('2020-05-20'); -- 返回21,第21周
next_day(STRING start_date, STRING day_of_week)
- 解釋
參數start_date可以是一個時間或日期,day_of_week表示星期幾,比如Mo表示星期一,Tu表示星期二,Wed表示星期三,Thur表示星期四,Fri表示星期五,Sat表示星期六,Sun表示星期日。如果指定的星期幾在該日期所在的周且在該日期之后,則返回當周的星期幾日期,如果指定的星期幾不在該日期所在的周,則返回下一個星期幾對應的日期
- 使用案例
select next_day('2020-05-20','Mon');-- 返回當前日期的下一個周一日期:2020-05-25
select next_day('2020-05-20','Tu');-- 返回當前日期的下一個周二日期:2020-05-26
select next_day('2020-05-20','Wed');-- 返回當前日期的下一個周三日期:2020-05-27
-- 2020-05-20為周三,指定的參數為周四,所以返回當周的周四就是2020-05-21
select next_day('2020-05-20','Th');
select next_day('2020-05-20','Fri');-- 返回周五日期2020-05-22
select next_day('2020-05-20','Sat'); -- 返回周六日期2020-05-23
select next_day('2020-05-20','Sun'); -- 返回周六日期2020-05-24
該函數比較重要:比如取當前日期所在的周一和周日,通過長用在按周進行匯總數據
select date_add(next_day('2020-05-20','MO'),-7); -- 返回當前日期的周一日期2020-05-18
select date_add(next_day('2020-05-20','MO'),-1); -- 返回當前日期的周日日期2020-05-24
months_between(DATE|TIMESTAMP|STRING date1, DATE|TIMESTAMP|STRING date2)
- 解釋
返回 date1 和 date2 的月份差。如果date1大於date2,返回正值,否則返回負值,如果是相減是整數月,則返回一個整數,否則會返回小數
- 使用案例
select months_between('2020-05-20','2020-05-20'); -- 返回0
select months_between('2020-05-20','2020-06-20'); -- 返回-1
-- 相差的整數月
select months_between('2020-06-30','2020-05-31'); -- 返回1
-- 非整數月,一個月差一天
select months_between('2020-06-29','2020-05-31'); -- 返回0.93548387
小結
本文主要介紹了Hive的條件函數和日期函數,並給出了每個函數的解釋說明和使用案例,本文覆蓋了所有Hive內置的條件函數和日期函數,可以作為一個函數字典,方便工作中使用。
公眾號『大數據技術與數倉』,回復『資料』領取大數據資料包