Hive函数大全(含例子)之集合函数、日期函数、条件函数

# 集合函数 Collection Functions

## size(Map<K.V>)

返回结果:返回Map中的元素个数

返回类型:int

  • select size(str_to_map('k1: v1')); -- 结果为 1
  • select size(str_to_map('k1:v1,k2:v2')); -- 结果为 2

## size(Array<T>)

返回结果:返回Array中的元素个数

返回类型:int

  • select size(array(1, 2, 3)); -- 结果为 3
  • select size(array('A', 'A')); -- 结果为 2

## map_keys(Map<K.V>)

返回结果:返回一个包含Map中所有Key的无序数组

返回类型:array<K>

  • select map_keys(str_to_map('k1:v1')); -- 结果为 ["k1"]
  • select map_keys(str_to_map('k1:v1,k2:v2')); -- 结果为 ["k2","k1"]

## map_values(Map<K.V>)

返回结果:返回一个包含Map中所有Value的无序数组

返回类型:array<V>

  • select map_values(str_to_map('k1:v1')); -- 结果为 ["v1"]
  • select map_values(str_to_map('k1:v1,k2:v2')); -- 结果为 ["v2","v1"]

## array_contains(Array<T>, value)

返回结果:如果Array<T>中包含value,则返回True,否则返回False

返回类型:boolean

  • select array_contains(array(1, 2), 3); -- 结果为 false
  • select array_contains(array('A', 'B', 'C'), 'A'); -- 结果为 true

## sort_array(Array<T>)

返回结果:返回一个升序排序的Array

返回类型:array<t>

  • select sort_array(array(3, 2, 4)); -- 结果为 [2,3,4]
  • select sort_array(array('9', '11', '12')); -- 结果为 ["11","12","9"]

# 日期函数 Date Functions

## from_unixtime(bigint unixtime[, string format])

返回结果:将Unix时间戳转换为字符串格式的时间

返回类型:string

  • select from_unixtime(1586225596, 'yyyy-MM-dd hh:mm:ss'); -- 结果为 2020-04-07 10:13:16
  • select from_unixtime(1586225596, 'yyyyMMdd'); -- 结果为 20200407

## unix_timestamp()

返回结果:返回当前Unix是时间戳,精确到秒

返回类型:bigint

  • select unix_timestamp(); -- 结果为 1586171888

## unix_timestamp(string date, string pattern)

返回结果:将字符串格式的时间转换为Unix时间戳格式

返回类型:bigint

  • select unix_timestamp('2020-01-01 01:01:02', 'yyyy-MM-dd hh:mm:ss'); -- 结果为 1577811662

## to_date(string timestamp)

返回结果:返回时间戳的日期部分

返回类型:2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date

  • select to_date('2020-04-05 06:07:08'); -- 结果为 2020-04-05

## year(string date)

返回结果:返回时间的年部分

返回类型:int

  • select year('2020-04-05 06:07:08'); -- 结果为 2020

## quarter(date/timestamp/string)

返回结果:返回季度

返回类型:int

  • select quarter('2020-04-05 06:07:08'); -- 结果为 2

## month(string date)

返回结果:返回时间的月部分

返回类型:int

  • select month('2020-04-05 06:07:08'); -- 结果为 4

## day(string date) dayofmonth(date)

返回结果:返回时间的日部分

返回类型:int

  • select day('2020-04-05 06:07:08'); -- 结果为 5
  • select dayofmonth('2020-04-05 06:07:08'); -- 结果为 5

## hour(string date)

返回结果:返回时间的小时部分

返回类型:int

  • select hour('2020-04-05 06:07:08'); -- 结果为 6

## minute(string date)

返回结果:返回时间的分钟部分

返回类型:int

  • select minute('2020-04-05 06:07:08'); -- 结果为 7

## second(string date)

返回结果:返回时间的秒部分

返回类型:int

  • select second('2020-04-05 06:07:08'); -- 结果为 8
  • select second('2020-04-05'); -- 结果为 NULL

## weekofyear(string date)

返回结果:返回date是当年的第几个星期

返回类型:int

  • select weekofyear('2020-01-01 06:07:08'); -- 结果为 1
  • select weekofyear('2020-01-06'); -- 结果为 2

## extract(field FROM source)

返回结果:从 source 中检索出指定日期部分(如检索出day, dayofweek, hour, minute, month, quarter, second, week and year)

返回类型:int

  • select extract(day from '2020-04-05 06:07:08'); -- 结果为 5
  • select extract(dayofweek from '2020-04-05 06:07:08'); -- 结果为 1(星期天为1)
  • select extract(dayofweek from '2020-04-06 06:07:08'); -- 结果为 2(星期一为2)
  • select extract(hour from '2020-04-05 06:07:08'); -- 结果为 6
  • select extract(minute from '2020-04-05 06:07:08'); -- 结果为 7
  • select extract(month from '2020-04-05 06:07:08'); -- 结果为 4
  • select extract(quarter from '2020-04-05 06:07:08'); -- 结果为 2
  • select extract(second from '2020-04-05 06:07:08'); -- 结果为 8
  • select extract(week from '2020-04-05 06:07:08'); -- 结果为 14(同weekofyear)
  • select extract(year from '2020-04-05 06:07:08'); -- 结果为 2020

## datediff(string enddate, string startdate)

返回结果:返回 enddate 和 startdate 相差的天数

返回类型:int

  • select datediff('2020-04-06 01:01:01', '2020-04-05 06:07:08'); -- 结果为 1
  • select datediff('2020-04-04', '2020-04-05'); -- 结果为 -1

## date_add(date/timestamp/string startdate, tinyint/smallint/int days)

返回结果:返回 startdate 增加 days 天之后的日期

返回类型:2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date

  • select date_add('2020-04-05 06:07:08', 1); -- 结果为 2020-04-06
  • select date_add('2020-04-05 06:07:08', -1); -- 结果为 2020-04-04

## date_sub(date/timestamp/string startdate, tinyint/smallint/int days)

返回结果:返回 startdate 减去 days 天之后的日期

返回类型:2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date

  • select date_sub('2020-04-05 06:07:08', 1); -- 结果为 2020-04-04
  • select date_sub('2020-04-05 06:07:08', -1); -- 结果为 2020-04-06

## from_utc_timestamp({any primitive type} ts, string timezone)

返回结果:转换为指定时区的时间戳

返回类型:timestamp

  • select from_utc_timestamp(2592000.0, 'GMT'); -- 结果为 1970-01-31 08:00:00
  • select from_utc_timestamp(2592000000, 'GMT'); -- 结果为 1970-01-31 08:00:00
  • select from_utc_timestamp(timestamp '1970-01-31 16:00:00', 'PST') ; -- 结果为 1970-01-31 08:00:00

## to_utc_timestamp({any primitive type} ts, string timezone)

返回结果:转换为世界标准时间UTC的时间戳

返回类型:timestamp

  • select to_utc_timestamp(2592000.0, 'GMT'); -- 结果为 1970-01-31 08:00:00
  • select to_utc_timestamp(2592000000, 'GMT'); -- 结果为 1970-01-31 08:00:00
  • select to_utc_timestamp(timestamp '1970-01-31 16:00:00', 'PST') ; -- 结果为 1970-02-01 00:00:00

## current_date

返回结果:返回当前日期(SQL查询计算开始时的日期,而不是结束时的日期)

返回类型:date

  • select current_date; -- 结果为 2020-04-06

## current_timestamp

返回结果:返回当前时间戳(SQL查询计算开始时的时间,而不是结束时的时间)

返回类型:timestamp

  • select current_timestamp; -- 结果为 2020-04-06 20:09:05.777

## add_months(string start_date, int num_months, output_date_format)

返回结果:返回 start_date 增加 num_months 月之后的日期(可指定输出的日期格式)

返回类型:string

  • select add_months('2020-01-01 01:01:01', 1); -- 结果为 2020-02-01
  • select add_months('2020-01-01 01:01:01', -1, 'yyyyMMddhhmmss'); -- 结果为 20191201010101

## last_day(string date)

返回结果:返回 date 所属月份的最后一天

返回类型:string

  • select last_day('2020-01-01'); -- 结果为 2020-01-31
  • select last_day('2020-02-01'); -- 结果为 2020-02-29

## next_day(string start_date, string day_of_week)

返回结果:返回晚于 start_date 的下一个星期几(day_of_week可以用两个字母、三个字母或者英文全拼来表示)(start_date的时分秒部分将被忽略)

返回类型:string

  • select next_day('2020-04-06', 'MON'); -- 结果为 2020-04-13
  • select next_day('2020-04-06', 'TU'); -- 结果为 2020-04-07
  • select next_day('2020-04-06 12:12:12', 'FRIDAY'); -- 结果为 2020-04-10

## trunc(string date, string format)

返回结果:截断日期到指定的日期精度,仅支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY)

返回类型:string

  • select trunc('2020-04-06', 'YY'); -- 结果为 2020-01-01
  • select trunc('2020-04-06', 'MM'); -- 结果为 2020-04-01
  • select trunc('2020-04-06 12:12:12', 'HH'); -- 结果为 NULL

## months_between(date1, date2)

返回结果:返回 date1 和 date2 的月份差

返回类型:double

  • select months_between('2020-01-31', '2020-02-29'); -- 结果为 -1.0
  • select months_between('2020-01-31', '2020-02-29');

## date_format(date/timestamp/string ts, string fmt)

返回结果:格式化日期

返回类型:string

  • select date_format('2020-04-06 12:12:12', 'yyyyMMddhhmmss'); -- 结果为 20200406121212
  • select date_format('2020-04-06 12:12:12', 'yyyy'); -- 结果为 2020
  • select date_format('2020-04-06', 'yyyy-MM-dd hh:mm:ss'); -- 结果为 2020-04-06 12:00:00

# 条件函数 Conditional Functions

## if(boolean testCondition, T valueTrue, T valueFalseOrNull)

返回结果:返回 valueTrue 如果 testCondition 成立,否则返回 valueFalseOrNull

返回类型:T

  • select if(2 > 1, 3, 4); -- 结果为 3
  • select if(2 > NULL, 3, 4); -- 结果为 4

## isnull( a )

返回结果:返回 True 如果 a is NULL,否则返回 False

返回类型:boolean

  • select isnull(NULL); -- 结果为 true
  • select isnull(1234); -- 结果为 false

## isnotnull ( a )

返回结果:返回 False 如果 a is NULL,否则返回 True

返回类型:boolean

  • select isnotnull (NULL); -- 结果为 false
  • select isnotnull (1234); -- 结果为 true

## nvl(T value, T default_value)

返回结果:如果 value 不为 NULL 则返回 value,否则返回 default_value

返回类型:T

  • select nvl('11', '22'); -- 结果为 11
  • select nvl(NULL, '22'); -- 结果为 22

## COALESCE(T v1, T v2, ...)

返回结果:返回第一个不为NULL的值,如果全为NULL则返回NULL

返回类型:T

  • select COALESCE('00', '11'); -- 结果为 00
  • select COALESCE(NULL, '22'); -- 结果为 22
  • select COALESCE(NULL, NULL, '33'); -- 结果为 33
  • select COALESCE(NULL, NULL, NULL); -- 结果为 NULL

## CASE a WHEN b THEN c [WHEN d THEN e] [ELSE f] END

返回结果:如果 a = b 则返回 c,如果 a = d 则返回 e,否则返回 f

返回类型:T

  • select case 1 when 1 then ; -- 结果为 213123123123
  • select date_format('123123123'); -- 结果为 213123123123
  • select date_format('123123123'); -- 结果为 213123123123

## CASE WHEN a THEN b [WHEN c THEN d] [ELSE e] END

返回结果:如果 a 成立则返回 b,[如果 c 成立则返回 d],否则返回 e

返回类型:T

  • select case when 1 = 1 then 'a' when 2 = 2 then 'b' else 'c' end; -- 结果为 a
  • select case when 1 = 2 then 'a' when 2 = 2 then 'b' else 'c' end; -- 结果为 b
  • select case when 1 = 2 then 'a' when 2 = 1 then 'b' else 'c' end; -- 结果为 c

## nullif( a, b )

返回结果:如果 a = b,返回 NULL,否则返回 a

返回类型:T

  • select nullif(1, 1); -- 结果为 NULL
  • select nullif(1, 2); -- 结果为 1

## assert_true(boolean condition)

返回结果:如果 condition 成立则返回 NULL,否则抛出异常

返回类型:void

  • select assert_true(2 > 1); -- 结果为 NULL
  • select assert_true(2 < 1); -- 结果为 Error during job, obtaining debugging information...

# 相关文章

Hive函数大全(含例子)之数学函数(Mathematical Functions)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容