感谢兄弟们的关注与支持,如果觉得有帮助的话,还请来个点赞、收藏、转发三 *** 作
该文章已更新到语雀中,后台回复“语雀”可获取进击吧大数据整个职业生涯持续更新的所有资料
感谢首先感谢linxiang同学提供的文章素材,linxiang在一次课上抛出了这样一个问题"在面试过程中,面试官问到我UDF是在Map端执行的,还是在Reduce端执行的"。我刚听到这个问题的时候,有点没反应过来,因为这个问题确实平时没有去思考过,后来仔细想了下,才有了现在的这篇文章。通过本文,你将可以了解到:
1、UDF和UDAF和UDTF之间的区别
2、UDF和UDAF和UDTF在运行过程中分别是在哪端执行的?
3、UDF和UDAF和UDTF在各个Hive版本中的内置函数(共175项函数)
4、UDF和UDAF和UDTF在日常开发中的实 ***
UDF全称为User Defined Function(即用户自定义函数),UDF开发在日常工作当中是非常普遍的。我们写一段SQL,调用UDF,得到结果就算是结束了,但大家有没有想过UDF底层是怎么执行的呢?那么我们拿MR引擎为例,那UDF是在Map端执行还是在Reduce端执行的呢?说实话,我之前没想过。既然没想过,那今天就来想一想。首先抛开在哪端执行不说,那我们知道UDF的模式是我们给一个值,然后再返回一个值。如上图所示,传一个A,返回给一个A_1;传一个B,返回给一个B_1;传一个C返回给一个C_1;这种模式就相当于在传入的一个值上进行了一些修饰后再返回给我们,相当于是一对一的模式。梳理到这里,答案也比较清晰了,这不就是map功能吗。有些同学可能会质疑,没关系,我们explain一下就知道了。
如上图所示,只有一个fetch Operator,当然这个demo比较简单,不会走MR的。从这里也可以看出来这就是一个转换功能,但有些同学仍有疑惑,没关系,让我们来一个走MR的例子。
explain select substr(id,2),count(1) from test group by substr(id,2);
到这里总能证明UDF函数是在Map阶段执行的吧!
UDAFUDAF全称为User-defined Aggregation Function,从命名来看,这是一种聚合函数,比如像我们常用的sum、max。如下图所示,可以抽象的理解成传入多个值,最后返回给我们一个值。那么对于该类型的函数是不是一定在reduce端执行了,为什么这么说呢?你看sum函数是不是会发生shuffle,是不是在reduce端做全局聚合呢(如果你这样想也没问题,但也有问题)我们通过explain命令来验证一下想法。我们执行如下命令:
explain select sum(id) from test
如上图所示,对于SUM类型的UDAF是在map端和reduce端都执行了,哎呦,这是怎么回事呢?我们回想一下MapReduce机制,如果我们要做全局聚合,难道要把所有的数据都拉取到reduce端吗?那reduce端压力是不是就会很大。所以有了局部聚合的这么一种优化方式。
那我们把局部聚合优化阶段给关闭后,再来看一下UDAF会在那一端执行
--关闭map端聚合 set hive.map.aggr=false;
如上图所示,当我们把局部聚合优化功能给关闭后,UDAF只会在reduce执行。
UDTFUDTF全称为User-defined Table Generating Function,该模式的功能是通过输入一行,返回多行。在实际场景中用的不多,该类型的执行阶段通常是在本地,大家也可以理解成是做map转换和UDF是一样的阶段。我们仍然用示例sql通过explain命令来验证一下
explain select explode(array(1,2,3,45));区别总结
ok,到了这里不知道大家对三种F的端执行类型是否有一些清晰的认识,这里再次做一些总结:
1、对于UDF来说,也就是大家通常认知的map转换功能,一般是在task本地执行,不会发生shuffle,一句话概括就是map端执行。
2、对于UDAF来说,通常是聚合类函数,那么就会发生shuffle网络传输,如果不做任何优化的话,只在reduce端执行,如果开启了局部优化,那么map端和reduce端都会执行。
3、对于UDTF来说,属于数据炸裂,可以和UDF同样认为都是在map端执行的。
注意:Hive中所有的关键词都是忽略大小写的。无论是通过Beeline还是CLI模式,都可以通过以下命令来查看Hive 函数
-- 查看所有的函数 show functions; ---查看具体某个函数的帮助手册 desc function function_name; --查看函数示例功能 desc function extended function_name;
注意点:当hive.cache.expr.evaluation参数设置为true的时候(当然默认值就是true),在0.12.0、0.13.0和0.13.1版本中,使用UDF嵌套到其他UDF函数中可能会有问题。具体可以见HIVE-7314
一、内置UDF函数 1.1、数学函数注意:当传入值为NULL的时候,返回值大多数也是NULL;
作用:返回绝对值
select abs(-1),abs(1);1.1.2、acos–>从Hive0.13.0
作用:如果 -1<=a<=1 或 NULL,则返回 a 的反余弦值。
select acos(0.1),acos(-1),acos(1),acos(-0.6)1.1.3、asin–>从Hive0.13.0
作用:如果 -1<=a<=1 或 NULL,则返回 a 的反正弦。
select asin(0.1),asin(-1),asin(1),asin(-0.6),asin(null);1.1.4、atan–>从Hive0.13.0
select atan(1.1),atan(0.543535)1.1.5、bin
select bin(234234324234);1.1.6、bround–>Hive1.3.0
select bround(2.4),bround(2.5),bround(3.5),bround(3.6554),bround(8.324,2),bround(3.234,1);1.1.7、cbrt–>Hive1.2.0
select cbrt(3.34543);1.1.8、ceil
select ceil(2.234),ceil(2.65),ceil(3.343);1.1.9、conv
select conv(234234,10,2),conv(234234,10,16);1.1.10、cos–>Hive0.13.0
select cos(23.23),cos(60),cos(90),cos(180);1.1.11、degress–>Hive0.13.0
select degrees(23.23432),degrees(23.66545);1.1.12、e
select e();1.1.13、exp–>Hive0.13.0
select exp(23.234),exp(23.354),exp(23.65),exp(2);1.1.14、factorial–>Hive1.2.0 1.1.15、floor
select floor(2.34),floor(2.756),floor(3.54);1.1.16、greatest–>Hive1.1.0
select greatest(1,2,34,45,234,342,42324);1.1.17、hex
select hex(23),hex(2);1.1.18、least
select least(1,2,34,45,234,342,42324);1.1.19、ln–>Hive0.13.0
select ln(10),ln(20),ln(0),ln(1);1.1.20、log2–>Hive0.13.0
select log2(4),log2(6),log2(8);1.1.21、log10–>Hive0.13.0
select log10(40),log10(60),log10(80),log10(100);1.1.22、negative
select negative(1),negative(20.234),negative(-20);1.1.23、pi
select pi();1.1.24、pmod
select pmod(10,2),pmod(10,3),pmod(10,4);1.1.25、positive
select positive(20),positive(10.234353);1.1.26、pow
select pow(5,2),pow(4,2);1.1.27、radians–>Hive0.13.0
select radians(4),radians(180),radians(360);1.1.28、rand
-- 可以指定种子序列,这样可以保障每次的结果都一致 select rand(),rand(5),rand(10);1.1.29、round
select round(3),round(3.2),round(3.43);1.1.30、shiftleft–>Hive1.2.0 1.1.31、shiftright–>Hive1.2.0 1.1.32、shiftrightunsigned–>Hive1.2.0 1.1.33、sign–>Hive0.13.0
select sign(23.23),sign(23),sign(-10);1.1.34、sin–>Hive0.13.0
select sin(60),sin(90),sin(180),sin(270),sin(360)1.1.35、sqrt–>Hive0.13.0
select sqrt(3),sqrt(4),sqrt(10);1.1.36、tan–>Hive0.13.0
select tan(30),tan(90),tan(180);1.1.37、unhex–>Hive0.12.0
select hex(57),unhex(57)1.1.38、width_bucket–>Hive3.0.0 1.2、集合函数
select map('a',1,'b',2),size(map('a',1,'b',2)),array(1,2,3,4),size(array(1,2,3,4));1.2.2、map_keys
select map('a',1,'b',2), map_keys(map('a',1,'b',2));1.2.3、map_values
select map('a',1,'b',2), map_values(map('a',1,'b',2));1.2.4、array_contains
select array(1,2,3,4),array_contains(array(1,2,3,4),1),array_contains(array(1,2,3,4),5);
注意:该函数中判断参数的类型要和数组元素类型保持一致,否则会查询失败
select array(1,2,3,4),array_contains(array(1,2,3,4),1),array_contains(array(1,2,3,4),'a');1.2.5、sort_array–>0.9.0
select array(4,2,3,234,234,23454,23),sort_array(array(4,2,3,234,234,23454,23));1.3、类型转化函数
select binary('a'),binary('2');1.3.2、cast
select cast('123' as int);1.4、日期函数
示例:
1. select extract(month from “2016-10-20”) results in 10.
1. select extract(hour from “2016-10-20 05:06:07”) results in 5.
1. select extract(dayofweek from “2016-10-20 05:06:07”) results in 5.
1. select extract(month from interval ‘1-3’ year to month) results in 3.
1. select extract(minute from interval ‘3 12:20:30’ day to second) results in 20.
|
|
| int | datediff(string enddate, string startdate) | 返回从 startdate 到 enddate 的天数:datediff(‘2009-03-01’, ‘2009-02-27’) = 2。 |
|
| pre 2.1.0: string
2.1.0 on: date | date_add(date/timestamp/string startdate, tinyint/smallint/int days) | 将天数添加到开始日期:date_add(‘2008-12-31’, 1) = ‘2009-01-01’。在 Hive 2.1.0 (HIVE-13248) 之前,返回类型是 String,因为在创建方法时不存在 Date 类型 |
|
| pre 2.1.0: string
2.1.0 on: date | date_sub(date/timestamp/string startdate, tinyint/smallint/int days) | 减去开始日期的天数:date_sub(‘2008-12-31’, 1) = ‘2008-12-30’。在 Hive 2.1.0 (HIVE-13248) 之前,返回类型是 String,因为在创建方法时不存在 Date 类型 |
| Hive0.8.0 | timestamp | from_utc_timestamp({any primitive type} ts, string timezone) | 将 UTC 中的时间戳转换为给定的时区(从 Hive 0.8.0 开始)。timestamp 是原始类型,包括timestamp/date、tinyint/smallint/int/bigint、float/double 和decimal。小数值被视为秒。整数值被视为毫秒。例如 from_utc_timestamp(2592000.0,‘PST’), from_utc_timestamp(2592000000,‘PST’) 和 from_utc_timestamp(timestamp ‘1970-01-30 16:00:00’,‘PST’)1930-1930-1930-时间戳08:00:00 |
| Hive0.8.0 | timestamp | to_utc_timestamp({any primitive type} ts, string timezone) | 将给定时区中的时间戳 转换为 UTC(从 Hive 0.8.0 开始)。timestamp 是原始类型,包括timestamp/date、tinyint/smallint/int/bigint、float/double 和decimal。小数值被视为秒。整数值被视为毫秒。例如 to_utc_timestamp(2592000.0,‘PST’), to_utc_timestamp(2592000000,‘PST’) 和 to_utc_timestamp(timestamp ‘1970-01-30 16:00:00’,‘PST’)1930-1930-1930-timestamp都返回时间戳00:00:00 |
| Hive1.2.0 | date | current_date | 返回查询开始时的当前日期(从Hive 1.2.0开始)。在同一个查询中对current_date的所有调用都会返回相同的值 |
| Hive1.2.0 | timestamp | current_timestamp | 返回查询评估开始时的当前时间戳(从Hive 1.2.0开始)。在同一个查询中调用current_timestamp,都会返回相同的值 |
| Hive1.1.0 | string | add_months(string start_date, int num_months, output_date_format) | 返回 start_date 之后 num_months 的日期(从 Hive 1.1.0 开始)。start_date 是一个字符串、日期或时间戳。num_months 是一个整数。如果 start_date 是该月的最后一天,或者如果结果月份的天数少于 start_date 的日期部分,则结果是结果月份的最后一天。否则,结果与 start_date 具有相同的日期部分。默认输出格式为“yyyy-MM-dd”。在 Hive 4.0.0 之前,忽略日期的时间部分。
从 Hive 4.0.0 开始,add_months 支持可选参数 output_date_format,它接受一个表示输出的有效日期格式的 String。这允许在输出中保留时间格式
For example :
add_months(‘2009-08-31’, 1) 返回’2009-09-30’.
add_months(‘2017-12-31 14:15:16’, 2, ‘YYYY-MM-dd HH:mm:ss’) 返回’2018-02-28 14:15:16’. |
| Hive1.1.0 | string | last_day(string date) | 返回日期所属月份的最后一天(从 Hive 1.1.0 开始)。日期是格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”的字符串。日期的时间部分被忽略。 |
| Hive1.2.0 | string | next_day(string start_date, string day_of_week) | 返回晚于 start_date 并命名为 day_of_week 的第一个日期(从 Hive 1.2.0)。start_date 是一个字符串/日期/时间戳。day_of_week 是星期几的 2 个字母、3 个字母或全名(例如 Mo、tue、FRIDAY)。start_date 的时间部分被忽略。示例:next_day(‘2015-01-14’, ‘TU’) = 2015-01-20 |
| Hive1.2.0 | string | trunc(string date, string format) | 返回截断为格式指定单位的日期(从 Hive 1.2.0 开始)。支持的格式:MONTH/MON/MM、YEAR/YYYY/YY。示例:trunc(‘2015-03-17’, ‘MM’) = 2015-03-01 |
| Hive1.2.0 | double | months_between(date1, date2) | 返回日期 date1 和 date2 之间的月数(从 Hive 1.2.0)。如果 date1 晚于 date2,则结果为正。如果 date1 早于 date2,则结果为负数。如果 date1 和 date2 是该月的同一天或都是该月的最后几天,则结果始终为整数。否则,UDF 会根据有 31 天的月份计算结果的小数部分,并考虑时间分量 date1 和 date2 的差异。date1 和 date2 类型可以是日期、时间戳或字符串,格式为“yyyy-MM-dd”或“yyyy-MM-dd HH:mm:ss”。结果四舍五入到小数点后 8 位。示例:months_between(‘1997-02-28 10:30:00’, ‘1996-10-30’) = 3.94959677 |
| Hive1.2.0 | string | date_format(date/timestamp/string ts, string fmt) | 将日期/时间戳/字符串转换为日期格式 fmt 指定格式的字符串值(从 Hive 1.2.0 开始)。第二个参数 fmt 应该是常量. 示例: date_format(‘2015-04-08’, ‘y’) = ‘2015’.
date_format can be used to implement other UDFs, e.g.:
- dayname(date) is date_format(date, ‘EEEE’)
- dayofyear(date) is date_format(date, ‘D’)
|
select from_unixtime(1638602968),from_unixtime(1638602968,'yyyy-MM-dd HH:mm:SS'),from_unixtime(1638602968,'yyyy-MM-dd');1.4.2、unix_timestamp
select unix_timestamp();1.4.3、to_date
select to_date('2021-12-04 2021-12-04 15:29:28'),to_date('2021-12-04 15:29:28');1.4.4、year
select year('2021-12-04 15:29:28');1.4.5、quarter–>Hive1.3.0 1.4.6、month
select month('2021-12-04 15:29:28');1.4.7、day
select day('2021-12-04 15:29:28');1.4.8、hour
select hour('2021-12-04 15:29:28');1.4.9、minute
select minute('2021-12-04 15:29:28');1.4.10、second
select second('2021-12-04 15:29:28');1.4.11、weekofyear
select weekofyear('2021-12-04 15:29:28');1.4.12、extract–>Hive2.2.0 1.4.13、datediff
select datediff('2009-03-01', '2009-02-27') ;1.4.14、date_add
select date_add('2021-12-04 15:29:28',1);1.4.15、date_sub
select date_add('2021-12-04 15:29:28',-1),date_sub('2021-12-04 15:29:28',1),date_sub('2021-12-04 15:29:28',-1);1.4.16、from_utc_timestamp–>Hive0.8.0
select from_utc_timestamp(timestamp '1970-01-30 16:00:00','PST') ,from_utc_timestamp(2592000.0,'PST');1.4.17、to_utc_timestamp–>Hive0.8.0
select to_utc_timestamp(2592000.0,'PST'), to_utc_timestamp(2592000000,'PST'),to_utc_timestamp(timestamp '1970-01-30 16:00:00','PST') ;1.4.18、current_date -->Hive1.2.0
select current_date();1.4.19、current_timestamp -->Hive1.2.0
select current_timestamp();1.4.20、add_months–>Hive1.1.0
select add_months('2009-08-31', 1),add_months('2017-12-31 14:15:16',3) ;1.4.21、last_day --> Hive1.1.0
select last_day('2021-12-04');1.4.22、next_day --> Hive1.2.0
--获取下一个周二 select next_day('2021-12-04', 'TU');1.4.23、trunc --> Hive1.2.0
--返回截断为格式指定单位的日期(从 Hive 1.2.0 开始)。支持的格式:MONTH/MON/MM、YEAR/YYYY/YY。 select trunc('2021-12-04', 'MM');1.4.24、months_between–>Hive1.2.0 1.4.25、date_format --> Hive1.2.0 1.5、判断函数
select if(1=1,'a','b'),if(1=2,'a','b') ;1.5.2、isnull
select isnull(1),isnull(null);1.5.3、isnotnull
select isnotnull(1),isnotnull(null);1.5.4、nvl
select nvl(1,1),nvl(null,1);1.5.5、coalesce
select coalesce(1,null,2,3,null,4,null),coalesce(null,null,null,2,3,4),coalesce(null,null,null,null);1.5.6、case when
select case when 1=1 then '1' else 'b' end ,case when 1=1 then '1' end;1.5.7、nullif -->Hive2.3.0 1.5.8、assert_true --> Hive0.8.0
select assert_true(1=1),assert_true(1=2);1.6、字符串函数
select ascii('a')1.6.2、base64–>Hive0.12.0
select base64(cast('abcd' as binary));1.6.3、character_length–>Hive2.2.0 1.6.4、chr–>Hive1.3.0 1.6.5、concat
select concat(1,'1','2','a'),concat(1,'a',null);1.6.6、context_ngrams 1.6.7、concat_ws
--该拼接函数仅支持字符串类型或者字符串数组类型 select concat_ws('-','1','2','3'),concat_ws('-',array('1','2','3'));1.6.8、decode -->Hive0.12.0
select decode(cast('abc' as binary),'ISO-8859-1');1.6.9、elt
--返回指定索引处的字符串 SELECT elt(2,'hello','world'),elt(1,'jello','world');1.6.10、encode -->Hive0.12.0
select encode('abc1233424asfsd','UTF-16LE');1.6.11、field
--返回指定字符串所在的索引处,如world字符串在第3个位置上 select field('world','say','hello','world')1.6.12、find_in_set
--返回 'abc,b,ab,c,def' 中第一次出现的 ab ,其中 'abc,b,ab,c,def' 是逗号分隔的字符串。如果任一参数为 null,则返回 null。如果第一个参数包含任何逗号,则返回 0 select find_in_set('ab', 'abc,b,ab,c,def') ;1.6.13、format_number–>Hive0.10.0
select format_number(2,1),format_number(2,2),format_number(2,3);1.6.14、get_json_object
select get_json_object('{"a":2,"b":1}','$.a');1.6.15、in_file 1.6.16、instr
select instr('asfdsarsrsf234','6'),instr('asfdsarsrsf234','a');1.6.17、length
select length('asfdsarsrsf234');1.6.18、locate
select locate('a','asfdsarsrsf234'),locate('6','asfdsarsrsf234');1.6.19、lower
select lower('AWFDSFDS');1.6.20、lpad
--返回10位长度的字符串,如果不原始字符串不足10位,则用*在左位填充 select lpad('sdfsd',10,'*');1.6.21、ltrim
select ltrim('safdsf '),length(ltrim('safdsf ')),length('safdsf ');1.6.22、ngrams 1.6.23、octet_length -->Hive2.2.0 1.6.24、parse_url
-- 可以指定HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, 和 USERINFO select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST');1.6.25、printf -->0.9.0
SELECT printf("His Name is%s, Age Is %d","Jetty",100);1.6.26、regexp_extract
SELECT regexp_extract('foothebar', 'foo(.*?)(bar)', 2) ;1.6.27、regexp_replace
select regexp_replace("foobar", "oo|ar", "");1.6.28、repeat
SELECT repeat('a',3);1.6.29、replace–>HIve1.3.0 1.6.30、reverse
select reverse("abcde");1.6.31、rpad
select rpad('ancd',10,'*');1.6.32、rtrim
select rtrim(' safdsf '),length(rtrim(' safdsf ')),length(' safdsf ');1.6.33、sentences
select sentences('Hello there! How are you?');1.6.34、space
select space(3),length(space(3));1.6.35、split
select split('ansdasdfc','a');1.6.36、str_to_map
select str_to_map('a-1,b-2,c-3',',','-');1.6.37、substr
select substr('foobar', 4), substr('foobar', 4, 1);1.6.38、substring_index -->Hive1.3.0 1.6.39、translate–>Hive0.14.0
select translate('asefsda12313asdf','123','*');1.6.40、trim
select trim(' safdsf '),length(trim(' safdsf ')),length(' safdsf ');1.6.41、unbase64 -->Hive0.12.0
select unbase64('wwewe.csdf');1.6.42、upper
select upper('fOoBaR') ;1.6.43、initcap–>Hive1.1.0
select initcap('asdfcasd');1.6.44、levenshtein -->Hive1.2.0
levenshtein('kitten', 'sitting');1.6.45、soundex -->Hive1.2.0
select soundex('Miller');1.7、掩码函数
SELECT java_method("java.lang.String", "valueOf", 1), java_method("java.lang.String", "isEmpty"), java_method("java.lang.Math", "max", 2, 3), java_method("java.lang.Math", "min", 2, 3), java_method("java.lang.Math", "round", 2.5), java_method("java.lang.Math", "exp", 1.0), java_method("java.lang.Math", "floor", 1.9)1.8.2、reflect --> Hive0.7.0
SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.String", "isEmpty"), reflect("java.lang.Math", "max", 2, 3), reflect("java.lang.Math", "min", 2, 3), reflect("java.lang.Math", "round", 2.5), reflect("java.lang.Math", "exp", 1.0), reflect("java.lang.Math", "floor", 1.9)1.8.3、hash --> Hive0.4
select hash('asfsd');1.8.4、current_user --> Hive1.2.0
select current_user();1.8.5、logged_in_user --> Hive2.2.0 1.8.6、current_database -->Hive0.13.0
select current_database();1.8.7、md5 -->Hive1.3.0
select md5('234');1.8.8、sha1 --> Hive1.3.0 1.8.9、crc32 --> Hive1.3.0 1.8.10、sha2–>Hive1.3.0 1.8.11、aes_encrypt --> Hive1.3.0 1.8.12、version --> Hive2.1.0 1.8.13、surrogate_key 二、内置UDAF函数
count(expr) - 返回提供的表达式为非 NULL 的行数.
count(DISTINCT expr[, expr]) -返回提供的表达式唯一且非 NULL 的行数。可以使用 hive.optimize.distinct.rewrite 优化此 *** 作的执行. |
|
| DOUBLE | sum(col), sum(DISTINCT col) | 返回组中元素的总和或组中列的不同值的总和。 |
|
| DOUBLE | avg(col), avg(DISTINCT col) | 返回组中元素的平均值或组中列的不同值的平均值 |
|
| DOUBLE | min(col) | 返回组中列的最小值 |
|
| DOUBLE | max(col) | 返回组中列的最大值。 |
|
| DOUBLE | variance(col), var_pop(col) | 返回组中数字列的方差 |
|
| DOUBLE | var_samp(col) | 返回组中数字列的无偏样本方差 |
|
| DOUBLE | stddev_pop(col) | 返回组中数字列的标准差 |
|
| DOUBLE | stddev_samp(col) | 返回组中数字列的无偏样本标准差 |
|
| DOUBLE | covar_pop(col1, col2) | 返回组中一对数值列的总体协方差 |
|
| DOUBLE | covar_samp(col1, col2) | 返回组中一对数字列的样本协方差 |
|
| DOUBLE | corr(col1, col2) | 返回组中一对数字列的 Pearson 相关系数 |
|
| DOUBLE | percentile(BIGINT col, p) | 返回组中列的确切第 p 个百分位数(不适用于浮点类型)。p 必须介于 0 和 1 之间。注意:只能为整数值计算真正的百分位数。如果您的输入是非整数,请使用 PERCENTILE_APPROX。 |
|
| array | percentile(BIGINT col, array(p1 [, p2]…)) | 返回组中列的确切百分位数 p1、p2、…(不适用于浮点类型)。pi 必须介于 0 和 1 之间。注意:只能为整数值计算真正的百分位数。如果您的输入是非整数,请使用 PERCENTILE_APPROX |
|
| DOUBLE | percentile_approx(DOUBLE col, p [, B]) | 返回组中数字列(包括浮点类型)的近似第 p 个百分位。B 参数以内存为代价控制近似精度。较高的值会产生更好的近似值,默认值为 10,000。当 col 中不同值的数量小于 B 时,这给出了精确的百分位值 |
|
| array | percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) | 同上,但接受并返回百分位值数组而不是单个值 |
| Hive2.2.0 | double | regr_avgx(independent, dependent) | 相当于 avg(依赖)。从 Hive 2.2.0 开始。 |
| Hive2.2.0 | double | regr_avgy(independent, dependent) | 相当于 avg(独立)。从 Hive 2.2.0 开始 |
| Hive2.2.0 | double | regr_count(independent, dependent) | 返回用于拟合线性回归线的非空对的数量。从 Hive 2.2.0 开始 |
| Hive2.2.0 | double | regr_intercept(independent, dependent) | 返回线性回归线的 y 截距,即等式中 b 的值依赖 = a * independent + b。从 Hive 2.2.0 开始 |
| Hive2.2.0 | double | regr_r2(independent, dependent) | 返回回归的决定系数。从 Hive 2.2.0 开始。 |
| Hive2.2.0 | double | regr_slope(independent, dependent) | 返回线性回归线的斜率,即等式中 a 的值依赖 = a * independent + b。从 Hive 2.2.0 开始。 |
| Hive2.2.0 | double | regr_sxx(independent, dependent) | 相当于 regr_count(independent,dependent) * var_pop(dependent)。从 Hive 2.2.0 开始。 |
| Hive2.2.0 | double | regr_sxy(independent, dependent) | 相当于 regr_count(independent,dependent) * covar_pop(independent,dependent)。从 Hive 2.2.0 开始 |
| Hive2.2.0 | double | regr_syy(independent, dependent) | 相当于 regr_count(independent,dependent) * var_pop(independent)。从 Hive 2.2.0 开始 |
|
| array
|
| array | collect_set(col) | 返回一组消除了重复元素的对象,可实现去重作用 |
| Hive0.13.0 | array | collect_list(col) | 返回具有重复项的对象列表,(从 Hive 0.13.0 开始。) |
| Hive0.11.0 | INTEGER | ntile(INTEGER x) | 将一个有序的分区分成 x 个称为桶的组,并为分区中的每一行分配一个桶号。这允许轻松计算三分位数、四分位数、十分位数、百分位数和其他常见的汇总统计数据。(从 Hive 0.11.0 开始。) |
--可以发现count(id)会把id=null的值剔除掉 select count(1),count(*),count(distinct id),count(id) from test2.2、sum
select sum(1) from test;2.3、avg
该函数太简单了,就不给大家演示了
2.4、min该函数太简单了,就不给大家演示了
2.5、max该函数太简单了,就不给大家演示了
2.6、variance 2.7、var_sample 2.8、stddev_pop 2.9、covar_pop 2.10、covar_samp 2.11、corr 2.12、percentile 2.13、percentile_approx 2.14、regr_avgx -->Hive2.2.0 2.15、regr_avgy -->Hive2.2.0 2.16、regr_count -->Hive2.2.0 2.17、regr_intercept -->Hive2.2.0 2.18、regr_r2 -->Hive2.2.0 2.19、regr_slope -->Hive2.2.0 2.20、regr_sxx -->Hive2.2.0 2.21、regr_sxy -->Hive2.2.0 2.22、regr_syy -->Hive2.2.0 2.23、histogram_numeric 2.24、collect_setselect collect_set(id),count(1) from test;2.25、collect_list --> Hive0.13.0
select collect_list(id),count(1) from test;2.26、ntile --> Hive0.11.0
select id, ntile(1) over(partition by id),--分组内的数据切分为1份 ntile(2) over(partition by id),--分组内的数据切分为2份 ntile(3) over(partition by id )--分组内的数据切分为2份 from test三、内置UDTF函数
select explode(array(100,200,300));
得到的结果如下:
select posexplode(array('A','B','C'));3.3、parse_url_tuple
select parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1','HOST', 'PATH', 'QUERY', 'QUERY:id');3.5、inline
select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02')));3.6、stack
select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01');3.7、json_tuple
select json_tuple('{"a":1,"b":2}','a','b','c');UDF和UDAF和UDTF开发 UDF开发
public class UDFYear extends UDF { private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); private final Calendar calendar = Calendar.getInstance(); private final IntWritable result = new IntWritable(); public UDFYear() { } public IntWritable evaluate(Text dateString) { if (dateString == null) { return null; } try { Date date = formatter.parse(dateString.toString()); calendar.setTime(date); result.set(calendar.get(Calendar.YEAR)); return result; } catch (ParseException e) { return null; } } public IntWritable evaluate(DateWritable d) { if (d == null) { return null; } calendar.setTime(d.get()); result.set(calendar.get(Calendar.YEAR)); return result; } public IntWritable evaluate(TimestampWritable t) { if (t == null) { return null; } calendar.setTime(t.getTimestamp()); result.set(calendar.get(Calendar.YEAR)); return result; } }UDAF开发
public class UDAFExampleMax extends UDAF { static public class MaxShortevaluator implements UDAFevaluator { private short mMax; private boolean mEmpty; public MaxShortevaluator() { super(); init(); } public void init() { mMax = 0; mEmpty = true; } public boolean iterate(ShortWritable o) { if (o != null) { if (mEmpty) { mMax = o.get(); mEmpty = false; } else { mMax = (short) Math.max(mMax, o.get()); } } return true; } public ShortWritable terminatePartial() { return mEmpty ? null : new ShortWritable(mMax); } public boolean merge(ShortWritable o) { return iterate(o); } public ShortWritable terminate() { return mEmpty ? null : new ShortWritable(mMax); } } static public class MaxIntevaluator implements UDAFevaluator { private int mMax; private boolean mEmpty; public MaxIntevaluator() { super(); init(); } public void init() { mMax = 0; mEmpty = true; } public boolean iterate(IntWritable o) { if (o != null) { if (mEmpty) { mMax = o.get(); mEmpty = false; } else { mMax = Math.max(mMax, o.get()); } } return true; } public IntWritable terminatePartial() { return mEmpty ? null : new IntWritable(mMax); } public boolean merge(IntWritable o) { return iterate(o); } public IntWritable terminate() { return mEmpty ? null : new IntWritable(mMax); } } static public class MaxLongevaluator implements UDAFevaluator { private long mMax; private boolean mEmpty; public MaxLongevaluator() { super(); init(); } public void init() { mMax = 0; mEmpty = true; } public boolean iterate(LongWritable o) { if (o != null) { if (mEmpty) { mMax = o.get(); mEmpty = false; } else { mMax = Math.max(mMax, o.get()); } } return true; } public LongWritable terminatePartial() { return mEmpty ? null : new LongWritable(mMax); } public boolean merge(LongWritable o) { return iterate(o); } public LongWritable terminate() { return mEmpty ? null : new LongWritable(mMax); } } static public class MaxFloatevaluator implements UDAFevaluator { private float mMax; private boolean mEmpty; public MaxFloatevaluator() { super(); init(); } public void init() { mMax = 0; mEmpty = true; } public boolean iterate(FloatWritable o) { if (o != null) { if (mEmpty) { mMax = o.get(); mEmpty = false; } else { mMax = Math.max(mMax, o.get()); } } return true; } public FloatWritable terminatePartial() { return mEmpty ? null : new FloatWritable(mMax); } public boolean merge(FloatWritable o) { return iterate(o); } public FloatWritable terminate() { return mEmpty ? null : new FloatWritable(mMax); } } static public class MaxDoubleevaluator implements UDAFevaluator { private double mMax; private boolean mEmpty; public MaxDoubleevaluator() { super(); init(); } public void init() { mMax = 0; mEmpty = true; } public boolean iterate(DoubleWritable o) { if (o != null) { if (mEmpty) { mMax = o.get(); mEmpty = false; } else { mMax = Math.max(mMax, o.get()); } } return true; } public DoubleWritable terminatePartial() { return mEmpty ? null : new DoubleWritable(mMax); } public boolean merge(DoubleWritable o) { return iterate(o); } public DoubleWritable terminate() { return mEmpty ? null : new DoubleWritable(mMax); } } static public class MaxStringevaluator implements UDAFevaluator { private Text mMax; private boolean mEmpty; public MaxStringevaluator() { super(); init(); } public void init() { mMax = null; mEmpty = true; } public boolean iterate(Text o) { if (o != null) { if (mEmpty) { mMax = new Text(o); mEmpty = false; } else if (mMax.compareTo(o) < 0) { mMax.set(o); } } return true; } public Text terminatePartial() { return mEmpty ? null : mMax; } public boolean merge(Text o) { return iterate(o); } public Text terminate() { return mEmpty ? null : mMax; } } }UDTF开发
public class GenericUDTFExplode extends GenericUDTF { private transient ObjectInspector inputOI = null; @Override public void close() throws HiveException { } @Override public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException { if (args.length != 1) { throw new UDFArgumentException("explode() takes only one argument"); } ArrayListfieldNames = new ArrayList (); ArrayList fieldOIs = new ArrayList (); switch (args[0].getCategory()) { case LIST: inputOI = args[0]; fieldNames.add("col"); fieldOIs.add(((ListObjectInspector)inputOI).getListElementObjectInspector()); break; case MAP: inputOI = args[0]; fieldNames.add("key"); fieldNames.add("value"); fieldOIs.add(((MapObjectInspector)inputOI).getMapKeyObjectInspector()); fieldOIs.add(((MapObjectInspector)inputOI).getMapValueObjectInspector()); break; default: throw new UDFArgumentException("explode() takes an array or a map as a parameter"); } return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } private transient final Object[] forwardListObj = new Object[1]; private transient final Object[] forwardMapObj = new Object[2]; @Override public void process(Object[] o) throws HiveException { switch (inputOI.getCategory()) { case LIST: ListObjectInspector listOI = (ListObjectInspector)inputOI; List> list = listOI.getList(o[0]); if (list == null) { return; } for (Object r : list) { forwardListObj[0] = r; forward(forwardListObj); } break; case MAP: MapObjectInspector mapOI = (MapObjectInspector)inputOI; Map,?> map = mapOI.getMap(o[0]); if (map == null) { return; } for (Entry,?> r : map.entrySet()) { forwardMapObj[0] = r.getKey(); forwardMapObj[1] = r.getValue(); forward(forwardMapObj); } break; default: throw new TaskExecutionException("explode() can only operate on an array or a map"); } } @Override public String toString() { return "explode"; } }
进击吧大数据
从事大数据行业多年,涉及范围包括不局限于基础支撑、计算引擎、数据整合、数据应用等多方向,参与过大型企业数仓体系建设、对数据建模、数据治理、业务增长有一定的理解;曾收获过多家一线大厂offer,目前带领团队建设企业实时数仓;欢迎大佬们一起加入交流成长
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)