HIVE基础-函数

一、explode

1、官网解析

把一个数组转换成多行

2、创建表hive_wc,字段sentence存放句子

create table hive_wc(sentence string);

load data local inpath '/opt/data/hive-wc.txt' into table hive_wc;

3、求每个单词出现的个数

思路:

(1)获取每个单词split(sentence,',')

(2)将单词划分成一行一列方便统计explode()

select explode(split(sentence,',')) from hive_wc;

(3)统计

select word,count(1) as c from

(select explode(split(sentence,',')) as word from hive_wc) t group by word;

二、处理JSON数据

1、创建一张表

create table rating_json(json string);

load data local inpath '/opt/data/rating.json' into table  rating_json;

2、查看官网(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)

select a.timestamp, b.*

from log a lateral view json_tuple(a.appevent, 'eventid''eventname') b as f1, f2;

参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object 高效,因为可以在一次调用中输入多个键

select json_tuple(json,"movie","rate","time","userid") as (movie,rate,time,userid) from rating_json limit 10;

总结:

(1)json_tuple(字段名,字段值中需要分开的值1,字段值中需要分开的值2......);

(2)as f1,f2;将字段值中需要分开的值1,字段值中需要分开的值2......重命名;

作业:

1)时间类型转换

input

1193    5    978300760

661      3    978302109

 

output

1193    5    2001 12 1 2001-12-01

三、top n问题

1、HIve创建新表,导入文件夹的数据

create table hive_rownumber(id int,age int,name string,sex string)

row format delimited fields terminated by '\t';

load data local inpath '/opt/data/hive_row_number.txt' into table hive_rownumber;

2、出现问题

3、将建表的分隔符改为,

create table hive_rownumber(id int,age int,name string,sex string)

row format delimited fields terminated by ',';

load data local inpath '/opt/data/hive_row_number.txt' into table hive_rownumber;

需求:

查询出每种性别总年龄最大的2条记录

4、窗口函数

ROW_NUMBER()

说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法:ROW_NUMBER () OVER ([ <partition_by_clause>]<order_by_clause> ) 。

备注:ORDERBY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数:<partition_by_clause> :将FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。

返回类型:bigint 。

select id ,age,name,sex 

from

(select id ,age,name,sex,row_number() over (partition by sex order by age desc) as rank from hive_rownumber) as t

where rank <=2 ;

四、UDF函数(User-Defined Functions:用户自定义函数)

UDF:一进一出(进来一条记录,出去一条记录):upper lower substring 函数

UDAF:Aggregation 多进一出:count max min sum...

UDTF:Table-Generation  一进多出 

Maven+HDFS

1、创建Maven项目

2、删除

3、添加

4、添加版本依赖

自定义函数的步骤:

(1)新建一个class,继承UDF

 直接找到org.apache.hadoop.ql.exec按确认

(2)研究UDF类

功能:输入xxx,输出hello,xxx,要引用

public Text evaluate(String a)

(3)建立main函数,创建对象

(4)输出结果

(5)打包

jar包在文件夹

(6)上传到服务器

(7)修改所属权组

chown -R HBinz:HBinz hive-1.0-SNAPSHOT.jar

三、hive使用自定义UDF函数

1、打开官网

2、创建自定义函数的语法

CREATE TEMPORARY FUNCTION sayHello AS 'com.ruozedata.bigdata.HelloUDF';

PS:仅对当前session优先

3、将jar包添加到hive,让hive可以使用

add JAR[S] <filepath> <filepath>* 
add jar /opt/lib/hive-1.0-SNAPSHOT.jar;

------------也可以在HIVE目录下创建文件夹存放jar包,就不用每次add了---------

4、hive执行上述命令

 5、hive上查看方法是否存在sayHello方法

show functions;

(6)其他窗口都可以使用funciton

语法:

CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

CREATE FUNCTION sayRuozeHello2 AS 'com.ruozedata.bigdata.HelloUDF'

USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar'; 

'file_uri':HDFS上的目录

default.sayruozehello函数创建成功。

永久函数是以:库名.函数名的存在,同库使用的时候可以直接用函数名,不同库使用的时候需要带上库名 

(7)在HDFS上创建目录

hdfs dfs -mkdir /lib

hdfs dfs -put hive-1.0-SNAPSHOT.jar /lib

(8)执行

CREATE FUNCTION sayRuozeHello2 AS 'com.ruozedata.bigdata.HelloUDF'

USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar'; 

(9)其他窗口都可以

(10)到metastore查看

查看数据库名称:

登陆数据库:

su - mysqladmin

mysql -uroot -p123456

show databases;

use hbinz001;

show tables;

select * from funcs;

四、了解UDF默认function的机制

1、IDEA查类

2、FunctionRegistry类的方法

与HIVE默认的UDF一样

3、引申出以后可以重写自定义UDF

4、注释间的对应

hive命令:

源码注释:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值