大数据学习-Hive 函数

目录

Hive函数

Hive的内置函数

数学函数

取整函数: round

指定精度取整函数: round

向下取整函数: floor

向上取整函数: ceil

取随机数函数: rand

幂运算函数: pow

绝对值函数: abs

字符串函数

字符串长度函数:length

字符串反转函数:reverse

字符串连接函数:concat

字符串连接函数-带分隔符:concat_ws

字符串截取函数:substr,substring

字符串截取函数:substr,substring

字符串转大写函数:upper,ucase

字符串转小写函数:lower,lcase

去空格函数:trim

左边去空格函数:ltrim

右边去空格函数:rtrim

正则表达式替换函数:regexp_replace

URL解析函数:parse_url

分割字符串函数: split

日期函数

获取当前UNIX时间戳函数:unix_timestamp

UNIX时间戳转日期函数:from_unixtime

日期转UNIX时间戳函数:unix_timestamp

指定格式日期转UNIX时间戳函数:unix_timestamp

日期时间转日期函数:to_date

日期转年函数: year

日期转月函数: month

日期转天函数: day

日期转周函数:weekofyear

日期比较函数: datediff

日期增加函数: date_add

日期减少函数: date_sub

条件函数

if函数: if

条件判断函数:CASE

条件判断函数:CASE

转换函数

cast()函数。

Hive的行转列

Hive的表生成函数

explode函数

LATERAL VIEW侧视图

LATERAL VIEW

Reflect函数

使用java.lang.Math当中的Max求两列中最大值

Hive的开窗函数

窗口函数(一) NTILE,ROW_NUMBER,RANK,DENSE_RANK

ROW_NUMBER

RANK 和 DENSE_RANK

Hive分析窗口函数(2) SUM,AVG,MIN,MAX

数据准备

SUM(结果和ORDER BY相关,默认为升序)

AVG,MIN,MAX

Hive分析窗口函数(3) LAG,LEAD,FIRST_VALUE,LAST_VALUE

准备数据

LAG

LEAD

FIRST_VALUE

LAST_VALUE

特别注意order by

Hive自定义函数

概述

自定义UDF

第一步:创建maven  java 工程,导入jar包

第二步:开发java类继承UDF,并重载evaluate 方法

第三步:将我们的项目打包,并上传到hive的lib目录下

第四步:添加我们的jar包

第五步:设置函数与我们的自定义函数关联

第六步:使用自定义函数

自定义UDTF

需求

代码实现

添加我们的jar包

创建临时函数与开发后的udtf代码关联

使用自定义udtf函数


Hive函数

Hive的函数分为三类: 聚合函数、内置函数,表生成函数,聚合函数之前已经学习过了,接下来学习内置函数和表生成函数.

Hive的内置函数

数学函数

取整函数: round

语法: round(double a)

返回值: BIGINT

说明:返回double类型的整数值部分(遵循四舍五入)

举例:

hive> select round(3.1415926);

3

指定精度取整函数: round

语法: round(double a, int d)

返回值: DOUBLE

说明:返回指定精度d的double类型

举例:

hive> select round(3.1415926,4);

3.1416

向下取整函数: floor

语法: floor(double a)

返回值: BIGINT

说明:返回等于或者小于该double变量的最大的整数

举例:

hive> select floor(3.1415926);

3

向上取整函数: ceil

语法: ceil(double a)

返回值: BIGINT

说明:返回等于或者大于该double变量的最小的整数

举例:

hive> select ceil(3.1415926) ;

4

取随机数函数: rand

语法: rand(),rand(int seed)

返回值: double

说明:返回一个0到1范围内的随机数。如果指定种子seed,则会返回固定的随机数

举例:

hive> select rand();

0.5577432776034763

hive> select rand();

0.6638336467363424

hive> select rand(100);

0.7220096548596434

hive> select rand(100);

0.7220096548596434

幂运算函数: pow

语法: pow(double a, double p)

返回值: double

说明:返回a的p次幂

举例:

hive> select pow(2,4) ;

16.0

绝对值函数: abs

语法: abs(double a)  abs(int a)

返回值: double       int

说明:返回数值a的绝对值

举例:

hive> select abs(-3.9);

3.9

hive> select abs(10.9);

10.9

字符串函数

字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:

hive> select length('abcedfg')l;

7

字符串反转函数:reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:

hive> select reverse(abcedfg);

gfdecba

字符串连接函数:concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

举例:

hive> select concat(‘abc’,'def’,'gh);;

abcdefgh

字符串连接函数-带分隔符:concat_ws

语法: concat_ws(string SEP, string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

举例:

hive> select concat_ws(',','abc','def','gh');

abc,def,gh

字符串截取函数:substr,substring

语法: substr(string A, int start),substring(string A, int start)

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:

hive> select substr('abcde',3);

cde

hive> select substring('abcde',3);

cde

hive>select substr('abcde',-1);

e

字符串截取函数:substr,substring

语法: substr(string A, int start, int len),substring(string A, intstart, int len)

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:

hive> select substr('abcde',3,2);

cd

hive> select substring('abcde',3,2);

cd

hive>select substring('abcde',-2,2);

de

字符串转大写函数:upper,ucase

语法: upper(string A) ucase(string A)

返回值: string

说明:返回字符串A的大写格式

举例:

hive> select upper('abSEd');

ABSED

hive> select ucase('abSEd');

ABSED

字符串转小写函数:lower,lcase

语法: lower(string A) lcase(string A)

返回值: string

说明:返回字符串A的小写格式

举例:

hive> select lower('abSEd');

absed

hive> select lcase('abSEd');

absed

去空格函数:trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:

hive> select trim(' abc ');

abc

左边去空格函数:ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:

hive> select ltrim(' abc ');

abc

右边去空格函数:rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:

hive> select rtrim(' abc ');

abc

正则表达式替换函数:regexp_replace

语法: regexp_replace(string A, string B, string C)

返回值: string

说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

举例:

hive> select regexp_replace('foobar', 'oo|ar', '');

fb

 

URL解析函数:parse_url

语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

返回值: string

说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

举例:

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST');

facebook.com

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'PATH');

/path1/p.php

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY','k1');

v1

分割字符串函数: split

语法: split(string str, stringpat)

返回值: array

说明:按照pat字符串分割str,会返回分割后的字符串数组

举例:

hive> select split('abtcdtef','t');

["ab","cd","ef"]

日期函数

获取当前UNIX时间戳函数:unix_timestamp

语法: unix_timestamp()

返回值: bigint

说明:获得当前时区的UNIX时间戳

举例:

hive> select unix_timestamp();

1323309615

UNIX时间戳转日期函数:from_unixtime

语法: from_unixtime(bigint unixtime[, string format])

返回值: string

说明:转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式

举例:

hive> select from_unixtime(1323308943,'yyyyMMdd');

20111208

日期转UNIX时间戳函数:unix_timestamp

语法: unix_timestamp(string date)

返回值: bigint

说明:转换格式为"yyyy-MM-ddHH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。

举例:

hive> select unix_timestamp('2011-12-07 13:01:03');

1323234063

指定格式日期转UNIX时间戳函数:unix_timestamp

语法: unix_timestamp(string date, string pattern)

返回值: bigint

说明:转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。

举例:

hive> select unix_timestamp('20111207 13:01:03','yyyyMMddHH:mm:ss');

1323234063

日期时间转日期函数:to_date

语法: to_date(string timestamp)

返回值: string

说明:返回日期时间字段中的日期部分。

举例:

hive> select to_date('2011-12-08 10:03:01');

2011-12-08

日期转年函数: year

语法: year(string date)

返回值: int

说明:返回日期中的年。

举例:

hive> select year('2011-12-08 10:03:01');

2011

hive> select year('2012-12-08');

2012

日期转月函数: month

语法: month (string date)

返回值: int

说明:返回日期中的月份。

举例:

hive> select month('2011-12-08 10:03:01');

12

hive> select month('2011-08-08');

8

日期转天函数: day

语法: day (string date)

返回值: int

说明:返回日期中的天。

举例:

hive> select day('2011-12-08 10:03:01');

8

hive> select day('2011-12-24');

24

同样的,还有 hour,minute,second函数,分别是获取小时,分钟和秒,使用方式和以上类似,这里就不再讲述。

日期转周函数:weekofyear

语法: weekofyear (string date)

返回值: int

说明:返回日期在当前的周数。

举例:

hive> select weekofyear('2011-12-08 10:03:01');

49

日期比较函数: datediff

语法: datediff(string enddate, string startdate)

返回值: int

说明:返回结束日期减去开始日期的天数。

举例:

hive> select datediff('2012-12-08','2012-05-09');

213

日期增加函数: date_add

语法: date_add(string startdate, int days)

返回值: string

说明:返回开始日期startdate增加days天后的日期。

举例:

hive> select date_add('2012-12-08',10);

2012-12-18

日期减少函数: date_sub

语法: date_sub (string startdate, int days)

返回值: string

说明:返回开始日期startdate减少days天后的日期。

举例:

hive> select date_sub('2012-12-08',10);

2012-11-28

条件函数

if函数: if

语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)

返回值: T

说明: 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull

举例:

hive> select if(1=2,100,200) ;

200

hive> select if(1=1,100,200) ;

100

条件判断函数:CASE

语法: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

返回值: T

说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f

举例:

hive> select case 100 when 50 then 'tom' when 100 then 'mary'else 'tim' end ;

mary

hive> select case 200 when 50 then 'tom' when 100 then 'mary'else 'tim' end ;

tim

条件判断函数:CASE

语法: CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

返回值: T

说明:如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e

举例:

hive> select case when 1=2 then 'tom' when 2=2 then 'mary' else'tim' end ;

mary

hive> select case when 1=1 then 'tom' when 2=2 then 'mary' else'tim' end ;

tom

转换函数

cast()函数。

公式:

cast(表达式 as 数据类型)

  cast函数,可以将"20190607"这样类型的时间数据转化成int类型数据。

  cast("20190607" as int)

select cast('2017-06-12' as date) filed;

Hive的行转列

1、行转列是指多行数据转换为一个列的字段。

2、Hive行转列用到的函数:

concat(str1,str2,...)  --字段或字符串拼接

concat_ws(sep, str1,str2) --以分隔符拼接每个字符串

collect_set(col) --将某字段的值进行去重汇总,产生array类型字段

测试数据:

 字段: deptno  ename 

20  SMITH  

30 ALLEN  

30 WARD   

20  JONES  

30 MARTIN 

30 BLAKE  

10 CLARK  

20  SCOTT  

10 KING   

30  TURNER 

20  ADAMS  

30  JAMES  

20 FORD   

10  MILLER 

操作步骤

1:建表

create table emp(

deptno int,

ename string

) row format delimited fields terminated by '\t';

2:插入数据:

load data local inpath "/opt/data/emp.txt" into table emp;

3:转换

select deptno,concat_ws("|",collect_set(ename)) as ems from emp group by deptno;

行转列,COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

4:结果查看

Hive的表生成函数

explode函数

explode(col):将hive一列中复杂的array或者map结构拆分成多行。

explode(ARRAY)  列表中的每个元素生成一行

explode(MAP)    map中每个key-value对,生成一行,key为一列,value为一列

数据:

10   CLARK|KING|MILLER

20   SMITH|JONES|SCOTT|ADAMS|FORD

30 ALLEN|WARD|MARTIN|BLAKE|TURNER|JAMES

建表:

create table emp(

deptno int,

names array<string>

)

row format delimited fields terminated by '\t'

collection items terminated by '|';

插入数据

load data local inpath "/server/data/hivedatas/emp3.txt" into table emp;

查询数据

select * from emp;

使用expload查询

select explode(names) as name from emp;

LATERAL VIEW侧视图

LATERAL VIEW

用法LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

列转行

select deptno,name from emp lateral view explode(names) tmp_tb as name;

Reflect函数

reflect函数可以支持在sql中调用java中的自带函数

使用java.lang.Math当中的Max求两列中最大值

--创建hive表

create table test_udf(col1 int,col2 int) row format delimited fields terminated by ',';

--准备数据 test_udf.txt

1,2

4,3

6,4

7,5

5,6

--加载数据

load data local inpath '/root/hivedata/test_udf.txt'  into table test_udf;

--使用java.lang.Math当中的Max求两列当中的最大值

select reflect("java.lang.Math","max",col1,col2) from test_udf;

不同记录执行不同的java内置函数

--创建hive表

create table test_udf2(class_name string,method_name string,col1 int , col2 int) row format delimited fields terminated by ',';

--准备数据 test_udf2.txt

java.lang.Math,min,1,2

java.lang.Math,max,2,3

--加载数据

load data local inpath '/root/hivedata/test_udf2.txt' into table test_udf2;

--执行查询

select reflect(class_name,method_name,col1,col2) from test_udf2;

Hive的开窗函数

窗口函数(一) NTILE,ROW_NUMBER,RANK,DENSE_RANK

数据准备

cookie1,2018-04-10,1

cookie1,2018-04-11,5

cookie1,2018-04-12,7

cookie1,2018-04-13,3

cookie1,2018-04-14,2

cookie1,2018-04-15,4

cookie1,2018-04-16,4

cookie2,2018-04-10,2

cookie2,2018-04-11,3

cookie2,2018-04-12,5

cookie2,2018-04-13,6

cookie2,2018-04-14,3

cookie2,2018-04-15,9

cookie2,2018-04-16,7

CREATE TABLE itcast_t2 (

cookieid string,

createtime string,   --day

pv INT

) ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

stored as textfile;

 

-- 加载数据:

load data local inpath '/root/hivedata/itcast_t2.dat' into table itcast_t2;

ROW_NUMBER

ROW_NUMBER()  从1开始,按照顺序,生成分组内记录的序列

SELECT

  cookieid,

  createtime,

  pv,

  ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn

  FROM itcast_t2;

RANK 和 DENSE_RANK

RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位

DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

SELECT

cookieid,

createtime,

pv,

RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn1,

DENSE_RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn2,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn3

FROM itcast_t2

WHERE cookieid = 'cookie1';

Hive分析窗口函数(2) SUM,AVG,MIN,MAX

数据准备

--建表语句:

create table itcast_t1(

cookieid string,

createtime string,   --day

pv int

) row format delimited

fields terminated by ',';

--加载数据:

load data local inpath '/root/hivedata/itcast_t1.dat' into table itcast_t1;

cookie1,2018-04-10,1

cookie1,2018-04-11,5

cookie1,2018-04-12,7

cookie1,2018-04-13,3

cookie1,2018-04-14,2

cookie1,2018-04-15,4

cookie1,2018-04-16,4

--开启智能本地模式

SET hive.exec.mode.local.auto=true;

SUM(结果和ORDER BY相关,默认为升序)

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid order by createtime) as pv1

from itcast_t1;

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2

from itcast_t1;

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid) as pv3

from itcast_t1;  --如果每天order  by排序语句  默认把分组内的所有数据进行sum操作

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid order by createtime rows between 3 preceding and current row) as pv4

from itcast_t1;

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid order by createtime rows between 3 preceding and 1 following) as pv5

from itcast_t1;

select cookieid,createtime,pv,

sum(pv) over(partition by cookieid order by createtime rows between current row and unbounded following) as pv6

from itcast_t1;

--pv1: 分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号

--pv2: 同pv1

--pv3: 分组内(cookie1)所有的pv累加

--pv4: 分组内当前行+往前3行,如,11号=10号+11号, 12号=10号+11号+12号,

                              13=10+11+12+13号, 14=11+12+13+14

--pv5: 分组内当前行+往前3行+往后1行,如,14号=11号+12号+13号+14号+15号=5+7+3+2+4=21

--pv6: 分组内当前行+往后所有行,如,13号=13号+14号+15号+16号=3+2+4+4=13,

                                                  14=14+15+16=2+4+4=10

/*

- 如果不指定rows between,默认为从起点到当前行;

- 如果不指定order by,则将分组内所有值累加;

- 关键是理解rows between含义,也叫做window子句:

  - preceding:往前

  - following:往后

  - current row:当前行

  - unbounded:起点

  - unbounded preceding 表示从前面的起点

  - unbounded following:表示到后面的终点

 */

AVG,MIN,MAX

AVG,MIN,MAX和SUM用法一样

select cookieid,createtime,pv,

avg(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2

from itcast_t1;

select cookieid,createtime,pv,

max(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2

from itcast_t1;

select cookieid,createtime,pv,

min(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2

from itcast_t1;

Hive分析窗口函数(3) LAG,LEAD,FIRST_VALUE,LAST_VALUE

准备数据

cookie1,2018-04-10 10:00:02,url2

cookie1,2018-04-10 10:00:00,url1

cookie1,2018-04-10 10:03:04,1url3

cookie1,2018-04-10 10:50:05,url6

cookie1,2018-04-10 11:00:00,url7

cookie1,2018-04-10 10:10:00,url4

cookie1,2018-04-10 10:50:01,url5

cookie2,2018-04-10 10:00:02,url22

cookie2,2018-04-10 10:00:00,url11

cookie2,2018-04-10 10:03:04,1url33

cookie2,2018-04-10 10:50:05,url66

cookie2,2018-04-10 11:00:00,url77

cookie2,2018-04-10 10:10:00,url44

cookie2,2018-04-10 10:50:01,url55

CREATE TABLE itcast_t4 (

cookieid string,

createtime string,  --页面访问时间

url STRING       --被访问页面

) ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

stored as textfile;

--加载数据:

load data local inpath '/root/hivedata/itcast_t4.dat' into table itcast_t4;

LAG

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT cookieid,

  createtime,

  url,

  ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

  LAG(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS last_1_time,

  LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS last_2_time

  FROM itcast_t4;

 

 --last_1_time: 指定了往上第1行的值,default为'1970-01-01 00:00:00'  

                           cookie1一行,往上1NULL,因此取默认 1970-01-01 00:00:00

                           cookie1三行,往上1值为第二行2015-04-10 10:00:02

                           cookie1六行,往上1值为第五行2015-04-10 10:50:01

--last_2_time: 指定了往上第2行的值,为指定默认值

                           cookie1一行,往上2NULL

                           cookie1二行,往上2NULL

                           cookie1四行,往上2为第二行2015-04-10 10:00:02

                           cookie1七行,往上2为第五行2015-04-10 10:50:01

LEAD

与LAG相反LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT cookieid,

createtime,

url,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

LEAD(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS next_1_time,

LEAD(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS next_2_time

FROM itcast_t4;

FIRST_VALUE

取分组内排序后,截止到当前行,第一个值

SELECT cookieid,

createtime,

url,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS first1

FROM itcast_t4;

LAST_VALUE

取分组内排序后,截止到当前行,最后一个值

SELECT cookieid,

createtime,

url,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1

FROM itcast_t4;

如果想要取分组内排序后最后一个值,则需要变通一下:

SELECT cookieid,

  createtime,

  url,

  ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

  LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1,

  FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime DESC) AS last2

  FROM itcast_t4

  ORDER BY cookieid,createtime;

特别注意order by

如果不指定ORDER BY,则进行排序混乱,会出现错误的结果

SELECT cookieid,

createtime,

url,

FIRST_VALUE(url) OVER(PARTITION BY cookieid) AS first2  

FROM itcast_t4;

Hive自定义函数

概述

Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

根据用户自定义函数类别分为以下三种:

   1、UDF(User-Defined-Function)

          一进一出

   2、UDAF(User-Defined Aggregation Function)

          聚集函数,多进一出

                    类似于:count/max/min

   3、UDTF(User-Defined Table-Generating Functions)

          一进多出

          如lateral view explore()

自定义UDF

编程步骤:

       (1)继承org.apache.hadoop.hive.ql.UDF

       (2)需要实现evaluate函数;evaluate函数支持重载;

注意事项:

       (1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

       (2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;

第一步:创建maven  java 工程,导入jar包

<dependencies>

    <dependency>

        <groupId>org.apache.hive</groupId>

        <artifactId>hive-exec</artifactId>

        <version>2.7.5</version>

    </dependency>

    <dependency>

        <groupId>org.apache.hadoop</groupId>

        <artifactId>hadoop-common</artifactId>

        <version>2.7.5</version>

    </dependency>

</dependencies>

    <build>

        <plugins>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>3.0</version>

                <configuration>

                    <source>1.8</source>

                    <target>1.8</target>

                    <encoding>UTF-8</encoding>

                </configuration>

            </plugin>

        </plugins>

    </build>

第二步:开发java类继承UDF,并重载evaluate 方法

public class MyUDF  extends UDF{

    public Text evaluate(final Text s) {

        if (null == s) {

            return null;

        }

        //返回大写字母

        return new Text(s.toString().toUpperCase());

    }

}

第三步:将我们的项目打包,并上传到hive的lib目录下

第四步:添加我们的jar包

重命名我们的jar包名称

cd /export/server/hive-2.7.5/lib

mv original-day_10_hive_udf-1.0-SNAPSHOT.jar my_upper.jar

hive的客户端添加我们的jar包

add jar /export/server/hive-2.7.5/lib/my_upper.jar;

第五步:设置函数与我们的自定义函数关联

create temporary function my_upper as 'cn.itcast.udf.ItcastUDF';

第六步:使用自定义函数

select my_upper('abc');

自定义UDTF

需求

自定义一个UDTF,实现将一个任意分隔符的字符串切割成独立的单词,例如:

源数据:

"zookeeper,hadoop,hdfs,hive,MapReduce"

目标数据:

zookeeper

hadoop

hdfs

hive

MapReduce

代码实现

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;

import org.apache.hadoop.hive.ql.metadata.HiveException;

import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;

import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;

import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

import java.util.ArrayList;

import java.util.List;

import java.util.function.ObjDoubleConsumer;

public class MyUDTF extends GenericUDTF {

    private final transient Object[] forwardListObj = new Object[1];

    @Override

    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {

        //设置列名的类型

        List<String> fieldNames = new ArrayList<>();

        //设置列名

        fieldNames.add("column_01");

        List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>()  ;//检查器列表

        //设置输出的列的值类型

        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);

    }

    @Override

    public void process(Object[] objects) throws HiveException {

        //1:获取原始数据

        String args = objects[0].toString();

        //2:获取数据传入的第二个参数,此处为分隔符

        String splitKey = objects[1].toString();

        //3.将原始数据按照传入的分隔符进行切分

        String[] fields = args.split(splitKey);

        //4:遍历切分后的结果,并写出

        for (String field : fields) {

            //将每一个单词添加值对象数组

            forwardListObj[0] = field;

            //将对象数组内容写出

            forward(forwardListObj);

        }

    }

    @Override

    public void close() throws HiveException {

    }

}

添加我们的jar包

将打包的jar包上传到node3主机/export/server/hive-2.7.5/lib目录,并重命名我们的jar包名称

cd /export/server/hive-2.7.5/lib

mv original-day_10_hive_udtf-1.0-SNAPSHOT.jar my_udtf.jar

hive的客户端添加我们的jar包,将jar包添加到hive的classpath下

hive>add jar /export/server/hive-2.7.5/lib/my_udtf.jar

创建临时函数与开发后的udtf代码关联

hive>create temporary function my_udtf as 'cn.itcast.udf.ItcastUDF';

使用自定义udtf函数

hive>select myudtf("zookeeper,hadoop,hdfs,hive,MapReduce",",") word;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32——温湿度采集与显示

一、I2C协议 关于I2C协议的基本原理和时序协议 12C协议使用两条线&#xff1a;SDA&#xff08;Serial Data Line&#xff0c;串行数据线&#xff09;和SCL&#xff08;Serial Clock Line&#xff0c;串行时钟线&#xff09;。这两条线都是开漏输出&#xff0c;意味着它们需要上…

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

语音相关算法学习整理

最近看了一下百度paddlespeech的一些公开课&#xff0c;把课程里的视频内容大体听了一下&#xff0c;现在整理一下笔记。教程链接见&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括&#xff1a; 将声音信号经过预加重、加窗、fft等…

JavaWeb——Mysql的启动/登录/卸载

目录 1.Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 2.2 登录Mysql 2.3 退出 3. 连接别人的数据库 4.卸载mqsql 1.Mysql服务器 安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 第一种方法&#xff1a;搜索服务&am…

如何在微信小程序使用vant 进行自定义底部tabbar组件

在微信小程序中使用 Vant 自定义底部 TabBar 需要进行以下步骤&#xff1a; 一、首先&#xff0c;你需要在 app.json 文件中配置自定义 TabBar。 在 "tabBar" 字段中&#xff0c;设置 "custom" 为 true&#xff0c;表示使用自定义 TabBar。 app.json示例…

python18 正则表达式

python18 正则表达式 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt re代码 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt rei…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

大数据经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…

进入容器修改内容_提交改变后的镜像_镜像保存成tar压缩包离线传输_镜像传输_镜像推送到公共仓库---分布式云原生部署架构搭建009

然后再来看,进入docker内部去看看. 用 docker exec -it imgid /bin/bash 这样就可以进入容器内部 而且关于,镜像的,内部放到什么地方了,都可以找到比如 在hub.docker的地址里面,找到nginx可以看到,对应的 /usr/share/nginx/html 可以看到这个路径. 然后去看看,进入到/usr…

如何恢复未格式化分区数据?看这里!

什么是未格式化分区&#xff1f; 未格式化或RAW文件系统的分区无法被Windows操作系统识别和挂载&#xff0c;因此&#xff0c;Windows会提示你进行格式化以创建新的文件系统。注意&#xff0c;不要进行格式化。通常&#xff0c;文件系统变为未格式化或RAW会出现以下常见错误消…

(深度学习记录)第TR5周:Transformer中的位置编码详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f3e1;我的环境&#xff1a; 语言环境&#xff1a;Python3.11.4编译器&#xff1a;Jupyter Notebooktorcch版本&#xff1a;2.0.…

【Matlab编程学习】 | matlab语言编程基础:常用图形绘制基础学习

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

传输层udp和tcp协议格式

UDP协议 UDP协议端格式 udp的前八个字节是报头&#xff0c;后面部分就是有效载荷。而目的端口号就保证了udp向应用层交付的问题。 而针对于报头和有效载荷分离是根据固定八字结的报头长度。数据的长度就是取决于报头中udp长度字段的大小来确定udp报文长度&#xff0c;因此也可…

Apifox 中如何处理加密或编码过的响应数据?

接口返回的响应数据有时是经过编码或加密处理的&#xff0c;要转换成可读的明文&#xff0c;可以使用 Apifox 内置的 JS 类库、或者通过调用外部编程语言 &#xff08;如 Python、JavaScript 等&#xff09; 来进行处理。 例如&#xff0c;一个经过 Base64 编码的数据可以通过…

可视化数据科学平台在信贷领域应用系列六:自动机器学习(上篇)

在现代数据驱动的世界中&#xff0c;机器学习已经成为解决复杂问题和推动创新的重要手段。然而&#xff0c;传统的机器学习模型开发过程复杂且耗时&#xff0c;包括数据预处理、特征工程、模型选择、参数调优和模型评估等多个步骤环节&#xff0c;需要模型开发人员具备丰富的专…

Java面试题:mysql执行速度慢的原因和优化

Sql语句执行速度慢 原因 聚合查询 多表查询 表数据量过大查询 深度分页查询 分析 sql的执行计划 可以使用EXPLAIN或者DESC获取Mysql如何执行SELECT语句的信息 直接在select语句前加关键字explain/desc 得到一个执行信息表 信息字段分析 possible_keys:可能使用到的索…

busybox的基本使用记录壹

内核如何启动init进程 init/main.c static int __ref kernel_init(void *unused) {int ret;kernel_init_freeable();/* need to finish all async __init code before freeing the memory */async_synchronize_full();ftrace_free_init_mem();jump_label_invalidate_initmem()…

JMeter的基本概念

一、主流测试工具 1&#xff0c;Loadrunner HP Loadrunner是一种工业级标准性能测试负载工具&#xff0c;可以模拟上万用户实施测试&#xff0c;并在测试时可实时检测应用服务器及服务器硬件各种数据&#xff0c;来确认和查找存在的瓶颈 支持多协议:Web(HTTP/HTML)、Windows…

Java项目:基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城【ssm+B/S架构+源码+数据库+答辩PPT+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能…