# 集合函數(shù) Collection Functions
## size(Map<K.V>)
返回結(jié)果:返回Map中的元素個(gè)數(shù)
返回類(lèi)型:int
- select size(str_to_map('k1: v1')); -- 結(jié)果為 1
- select size(str_to_map('k1:v1,k2:v2')); -- 結(jié)果為 2
## size(Array<T>)
返回結(jié)果:返回Array中的元素個(gè)數(shù)
返回類(lèi)型:int
- select size(array(1, 2, 3)); -- 結(jié)果為 3
- select size(array('A', 'A')); -- 結(jié)果為 2
## map_keys(Map<K.V>)
返回結(jié)果:返回一個(gè)包含Map中所有Key的無(wú)序數(shù)組
返回類(lèi)型:array<K>
- select map_keys(str_to_map('k1:v1')); -- 結(jié)果為 ["k1"]
- select map_keys(str_to_map('k1:v1,k2:v2')); -- 結(jié)果為 ["k2","k1"]
## map_values(Map<K.V>)
返回結(jié)果:返回一個(gè)包含Map中所有Value的無(wú)序數(shù)組
返回類(lèi)型:array<V>
- select map_values(str_to_map('k1:v1')); -- 結(jié)果為 ["v1"]
- select map_values(str_to_map('k1:v1,k2:v2')); -- 結(jié)果為 ["v2","v1"]
## array_contains(Array<T>, value)
返回結(jié)果:如果Array<T>中包含value笛求,則返回True,否則返回False
返回類(lèi)型:boolean
- select array_contains(array(1, 2), 3); -- 結(jié)果為 false
- select array_contains(array('A', 'B', 'C'), 'A'); -- 結(jié)果為 true
## sort_array(Array<T>)
返回結(jié)果:返回一個(gè)升序排序的Array
返回類(lèi)型:array<t>
- select sort_array(array(3, 2, 4)); -- 結(jié)果為 [2,3,4]
- select sort_array(array('9', '11', '12')); -- 結(jié)果為 ["11","12","9"]
# 日期函數(shù) Date Functions
## from_unixtime(bigint unixtime[, string format])
返回結(jié)果:將Unix時(shí)間戳轉(zhuǎn)換為字符串格式的時(shí)間
返回類(lèi)型:string
- select from_unixtime(1586225596, 'yyyy-MM-dd hh:mm:ss'); -- 結(jié)果為 2020-04-07 10:13:16
- select from_unixtime(1586225596, 'yyyyMMdd'); -- 結(jié)果為 20200407
## unix_timestamp()
返回結(jié)果:返回當(dāng)前Unix是時(shí)間戳糕簿,精確到秒
返回類(lèi)型:bigint
- select unix_timestamp(); -- 結(jié)果為 1586171888
## unix_timestamp(string date, string pattern)
返回結(jié)果:將字符串格式的時(shí)間轉(zhuǎn)換為Unix時(shí)間戳格式
返回類(lèi)型:bigint
- select unix_timestamp('2020-01-01 01:01:02', 'yyyy-MM-dd hh:mm:ss'); -- 結(jié)果為 1577811662
## to_date(string timestamp)
返回結(jié)果:返回時(shí)間戳的日期部分
返回類(lèi)型:2.1.0之前版本返回的是string探入,2.1.0版本及之后返回的是date
- select to_date('2020-04-05 06:07:08'); -- 結(jié)果為 2020-04-05
## year(string date)
返回結(jié)果:返回時(shí)間的年部分
返回類(lèi)型:int
- select year('2020-04-05 06:07:08'); -- 結(jié)果為 2020
## quarter(date/timestamp/string)
返回結(jié)果:返回季度
返回類(lèi)型:int
- select quarter('2020-04-05 06:07:08'); -- 結(jié)果為 2
## month(string date)
返回結(jié)果:返回時(shí)間的月部分
返回類(lèi)型:int
- select month('2020-04-05 06:07:08'); -- 結(jié)果為 4
## day(string date) dayofmonth(date)
返回結(jié)果:返回時(shí)間的日部分
返回類(lèi)型:int
- select day('2020-04-05 06:07:08'); -- 結(jié)果為 5
- select dayofmonth('2020-04-05 06:07:08'); -- 結(jié)果為 5
## hour(string date)
返回結(jié)果:返回時(shí)間的小時(shí)部分
返回類(lèi)型:int
- select hour('2020-04-05 06:07:08'); -- 結(jié)果為 6
## minute(string date)
返回結(jié)果:返回時(shí)間的分鐘部分
返回類(lèi)型:int
- select minute('2020-04-05 06:07:08'); -- 結(jié)果為 7
## second(string date)
返回結(jié)果:返回時(shí)間的秒部分
返回類(lèi)型:int
- select second('2020-04-05 06:07:08'); -- 結(jié)果為 8
- select second('2020-04-05'); -- 結(jié)果為 NULL
## weekofyear(string date)
返回結(jié)果:返回date是當(dāng)年的第幾個(gè)星期
返回類(lèi)型:int
- select weekofyear('2020-01-01 06:07:08'); -- 結(jié)果為 1
- select weekofyear('2020-01-06'); -- 結(jié)果為 2
## extract(field FROM source)
返回結(jié)果:從 source 中檢索出指定日期部分(如檢索出day, dayofweek, hour, minute, month, quarter, second, week and year)
返回類(lèi)型:int
- select extract(day from '2020-04-05 06:07:08'); -- 結(jié)果為 5
- select extract(dayofweek from '2020-04-05 06:07:08'); -- 結(jié)果為 1(星期天為1)
- select extract(dayofweek from '2020-04-06 06:07:08'); -- 結(jié)果為 2(星期一為2)
- select extract(hour from '2020-04-05 06:07:08'); -- 結(jié)果為 6
- select extract(minute from '2020-04-05 06:07:08'); -- 結(jié)果為 7
- select extract(month from '2020-04-05 06:07:08'); -- 結(jié)果為 4
- select extract(quarter from '2020-04-05 06:07:08'); -- 結(jié)果為 2
- select extract(second from '2020-04-05 06:07:08'); -- 結(jié)果為 8
- select extract(week from '2020-04-05 06:07:08'); -- 結(jié)果為 14(同weekofyear)
- select extract(year from '2020-04-05 06:07:08'); -- 結(jié)果為 2020
## datediff(string enddate, string startdate)
返回結(jié)果:返回 enddate 和 startdate 相差的天數(shù)
返回類(lèi)型:int
- select datediff('2020-04-06 01:01:01', '2020-04-05 06:07:08'); -- 結(jié)果為 1
- select datediff('2020-04-04', '2020-04-05'); -- 結(jié)果為 -1
## date_add(date/timestamp/string startdate, tinyint/smallint/int days)
返回結(jié)果:返回 startdate 增加 days 天之后的日期
返回類(lèi)型:2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date
- select date_add('2020-04-05 06:07:08', 1); -- 結(jié)果為 2020-04-06
- select date_add('2020-04-05 06:07:08', -1); -- 結(jié)果為 2020-04-04
## date_sub(date/timestamp/string startdate, tinyint/smallint/int days)
返回結(jié)果:返回 startdate 減去 days 天之后的日期
返回類(lèi)型:2.1.0之前版本返回的是string懂诗,2.1.0版本及之后返回的是date
- select date_sub('2020-04-05 06:07:08', 1); -- 結(jié)果為 2020-04-04
- select date_sub('2020-04-05 06:07:08', -1); -- 結(jié)果為 2020-04-06
## from_utc_timestamp({any primitive type} ts, string timezone)
返回結(jié)果:轉(zhuǎn)換為指定時(shí)區(qū)的時(shí)間戳
返回類(lèi)型:timestamp
- select from_utc_timestamp(2592000.0, 'GMT'); -- 結(jié)果為 1970-01-31 08:00:00
- select from_utc_timestamp(2592000000, 'GMT'); -- 結(jié)果為 1970-01-31 08:00:00
- select from_utc_timestamp(timestamp '1970-01-31 16:00:00', 'PST') ; -- 結(jié)果為 1970-01-31 08:00:00
## to_utc_timestamp({any primitive type} ts, string timezone)
返回結(jié)果:轉(zhuǎn)換為世界標(biāo)準(zhǔn)時(shí)間UTC的時(shí)間戳
返回類(lèi)型:timestamp
- select to_utc_timestamp(2592000.0, 'GMT'); -- 結(jié)果為 1970-01-31 08:00:00
- select to_utc_timestamp(2592000000, 'GMT'); -- 結(jié)果為 1970-01-31 08:00:00
- select to_utc_timestamp(timestamp '1970-01-31 16:00:00', 'PST') ; -- 結(jié)果為 1970-02-01 00:00:00
## current_date
返回結(jié)果:返回當(dāng)前日期(SQL查詢計(jì)算開(kāi)始時(shí)的日期蜂嗽,而不是結(jié)束時(shí)的日期)
返回類(lèi)型:date
- select current_date; -- 結(jié)果為 2020-04-06
## current_timestamp
返回結(jié)果:返回當(dāng)前時(shí)間戳(SQL查詢計(jì)算開(kāi)始時(shí)的時(shí)間,而不是結(jié)束時(shí)的時(shí)間)
返回類(lèi)型:timestamp
- select current_timestamp; -- 結(jié)果為 2020-04-06 20:09:05.777
## add_months(string start_date, int num_months, output_date_format)
返回結(jié)果:返回 start_date 增加 num_months 月之后的日期(可指定輸出的日期格式)
返回類(lèi)型:string
- select add_months('2020-01-01 01:01:01', 1); -- 結(jié)果為 2020-02-01
- select add_months('2020-01-01 01:01:01', -1, 'yyyyMMddhhmmss'); -- 結(jié)果為 20191201010101
## last_day(string date)
返回結(jié)果:返回 date 所屬月份的最后一天
返回類(lèi)型:string
- select last_day('2020-01-01'); -- 結(jié)果為 2020-01-31
- select last_day('2020-02-01'); -- 結(jié)果為 2020-02-29
## next_day(string start_date, string day_of_week)
返回結(jié)果:返回晚于 start_date 的下一個(gè)星期幾(day_of_week可以用兩個(gè)字母殃恒、三個(gè)字母或者英文全拼來(lái)表示)(start_date的時(shí)分秒部分將被忽略)
返回類(lèi)型:string
- select next_day('2020-04-06', 'MON'); -- 結(jié)果為 2020-04-13
- select next_day('2020-04-06', 'TU'); -- 結(jié)果為 2020-04-07
- select next_day('2020-04-06 12:12:12', 'FRIDAY'); -- 結(jié)果為 2020-04-10
## trunc(string date, string format)
返回結(jié)果:截?cái)嗳掌诘街付ǖ娜掌诰戎簿桑瑑H支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY)
返回類(lèi)型:string
- select trunc('2020-04-06', 'YY'); -- 結(jié)果為 2020-01-01
- select trunc('2020-04-06', 'MM'); -- 結(jié)果為 2020-04-01
- select trunc('2020-04-06 12:12:12', 'HH'); -- 結(jié)果為 NULL
## months_between(date1, date2)
返回結(jié)果:返回 date1 和 date2 的月份差
返回類(lèi)型:double
- select months_between('2020-01-31', '2020-02-29'); -- 結(jié)果為 -1.0
- select months_between('2020-01-31', '2020-02-29');
## date_format(date/timestamp/string ts, string fmt)
返回結(jié)果:格式化日期
返回類(lèi)型:string
- select date_format('2020-04-06 12:12:12', 'yyyyMMddhhmmss'); -- 結(jié)果為 20200406121212
- select date_format('2020-04-06 12:12:12', 'yyyy'); -- 結(jié)果為 2020
- select date_format('2020-04-06', 'yyyy-MM-dd hh:mm:ss'); -- 結(jié)果為 2020-04-06 12:00:00
# 條件函數(shù) Conditional Functions
## if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回結(jié)果:返回 valueTrue 如果 testCondition 成立,否則返回 valueFalseOrNull
返回類(lèi)型:T
- select if(2 > 1, 3, 4); -- 結(jié)果為 3
- select if(2 > NULL, 3, 4); -- 結(jié)果為 4
## isnull( a )
返回結(jié)果:返回 True 如果 a is NULL离唐,否則返回 False
返回類(lèi)型:boolean
- select isnull(NULL); -- 結(jié)果為 true
- select isnull(1234); -- 結(jié)果為 false
## isnotnull ( a )
返回結(jié)果:返回 False 如果 a is NULL病附,否則返回 True
返回類(lèi)型:boolean
- select isnotnull (NULL); -- 結(jié)果為 false
- select isnotnull (1234); -- 結(jié)果為 true
## nvl(T value, T default_value)
返回結(jié)果:如果 value 不為 NULL 則返回 value,否則返回 default_value
返回類(lèi)型:T
- select nvl('11', '22'); -- 結(jié)果為 11
- select nvl(NULL, '22'); -- 結(jié)果為 22
## COALESCE(T v1, T v2, ...)
返回結(jié)果:返回第一個(gè)不為NULL的值亥鬓,如果全為NULL則返回NULL
返回類(lèi)型:T
- select COALESCE('00', '11'); -- 結(jié)果為 00
- select COALESCE(NULL, '22'); -- 結(jié)果為 22
- select COALESCE(NULL, NULL, '33'); -- 結(jié)果為 33
- select COALESCE(NULL, NULL, NULL); -- 結(jié)果為 NULL
## CASE a WHEN b THEN c [WHEN d THEN e] [ELSE f] END
返回結(jié)果:如果 a = b 則返回 c完沪,如果 a = d 則返回 e,否則返回 f
返回類(lèi)型:T
- select case 1 when 1 then ; -- 結(jié)果為 213123123123
- select date_format('123123123'); -- 結(jié)果為 213123123123
- select date_format('123123123'); -- 結(jié)果為 213123123123
## CASE WHEN a THEN b [WHEN c THEN d] [ELSE e] END
返回結(jié)果:如果 a 成立則返回 b贮竟,[如果 c 成立則返回 d]丽焊,否則返回 e
返回類(lèi)型:T
- select case when 1 = 1 then 'a' when 2 = 2 then 'b' else 'c' end; -- 結(jié)果為 a
- select case when 1 = 2 then 'a' when 2 = 2 then 'b' else 'c' end; -- 結(jié)果為 b
- select case when 1 = 2 then 'a' when 2 = 1 then 'b' else 'c' end; -- 結(jié)果為 c
## nullif( a, b )
返回結(jié)果:如果 a = b较剃,返回 NULL,否則返回 a
返回類(lèi)型:T
- select nullif(1, 1); -- 結(jié)果為 NULL
- select nullif(1, 2); -- 結(jié)果為 1
## assert_true(boolean condition)
返回結(jié)果:如果 condition 成立則返回 NULL技健,否則拋出異常
返回類(lèi)型:void
- select assert_true(2 > 1); -- 結(jié)果為 NULL
- select assert_true(2 < 1); -- 結(jié)果為 Error during job, obtaining debugging information...
# 相關(guān)文章
Hive函數(shù)大全(含例子)之?dāng)?shù)學(xué)函數(shù)(Mathematical Functions)