我是靠谱客的博主 壮观水壶,最近开发中收集的这篇文章主要介绍Hive函数和UDF详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Hive函数

1.数学函数
(1)round
①返回对a四舍五入的BIGINT值

round(DOUBLE a)

返回值:DOUBLE
②返回对a四舍五入并保留d位小数位的值

round(DOUBLE a, INT d)

返回值:binary
(2)floor
向下取整,如:6.10->6 -3.4->-4

floor(DOUBLE a)

返回值:BIGINT
(3)rand
返回一个DOUBLE型随机数,seed是随机因子

rand(INT seed)

返回值:DOUBLE
(4)power
计算a的p次幂

power(DOUBLE a, DOUBLE p)

返回值:DOUBLE
(5)abs
计算a的绝对值

abs(DOUBLE a)

返回值:DOUBLE

2.类型转换函数
(1)cast
将expr转换成type类型 如:cast(“1” as BIGINT) 将字符串1转换成了BIGINT类型

cast(expr as <type>)

返回值:“type”

(2)binary
将输入的值转换成二进制

binary(string|binary)

返回值:binary

3.日期函数
(1)from_unixtime
将时间戳转换成format格式

from_unixtime(bigint unixtime[, string format])

返回值:string

(2)unix_timestamp
获取本地时区下的时间戳

unix_timestamp()

返回值:int

(3)unix_timestamp
将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳

unix_timestamp(string date)

返回值:bigint
(4)to_date
返回时间字符串的日期部分

to_date(string timestamp)

返回值:string
(5)year/month/day/hour/minute/second/weekofyear
返回时间字符串的年份部分,返回月/天/时/分/秒/第几周

year/month/day/hour/minute/second/weekofyear(string date)

返回值:int
(6)datediff
计算开始时间到结束时间相差的天数

datediff(string enddate, string startdate)

返回值:int

(7)date_add
从开始时间startdate加上days

date_add(string startdate, int days)

返回值:string

(8)date_sub
从开始时间startdate减去days

date_sub(string startdate, int days)

返回值:string

(9)current_date
返回当前时间的日期
返回值:date
(10)current_timestamp
返回当前时间戳
返回值:timestamp
(11)date_format
按指定格式返回时间date 如:date_format(“2016-06-22”,“MM-dd”)=06-22

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

返回值:string

4.字符函数
(1)concat
对二进制字节码或字符串按次序进行拼接

concat(string|binary A, string|binary B...)

返回值:string

(2)instr
查找字符串str中子字符串substr出现的位置

instr(string str, string substr)

返回值:int

(3)length
返回字符串的长度

length(string A)

返回值:int

(4)locate
查找字符串str中的pos位置后字符串substr第一次出现的位置

locate(string substr, string str[, int pos])

返回值:int

(5)lower/upper
将字符串A的所有字母转换成小写/大写字母

lower(string A) /upper(string A)

返回值:string

(6)regexp_replace
按正则表达式PATTERN将字符串中符合条件的部分替换成REPLACEMENT所指定的字符串

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

返回值:string

(7)split
按照正则表达式pat来分割字符串str

split(string str, string pat)

返回值:string

(8)substr/substring
对字符串A,从start位置开始截取长度为len的字符串并返回

substr/substring(string|binary A, int start, int len)

(9)trim
将字符串A前后出现的空格去掉

trim(string A)

返回值:string

(10)str_to_map
将字符串str按照指定分隔符转换成Map

str_to_map(text[, delimiter1, delimiter2])

返回值:map
(11)encode
用指定字符集charset将字符串编码成二进制值

encode(string src, string charset)

返回值:binary

5.集合函数
(1)size
①返回map中键值对个数

size(Map<K.V>)

返回值:int
②返回数组的长度

size(Array<T>)

返回值:int
(2)map_keys
返回map中的所有key

map_keys(Map<K.V>)

返回值:array

(3)map_values
返回map中所有的value

map_values(Map<K.V>)

返回值:array

(4)array_contains
如该数组Array包含value返回true。,否则返回false

array_contains(Array<T>, value)

返回值:boolean

(5)sort_array
对数组进行排序

sort_array(Array<T>)

返回值:array

6.条件函数
(1)if
如果testCondition 为true就返回valueTrue,否则返回valueFalseOrNull

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

返回值:T

(2)nvl
value为NULL返回default_value,否则返回value

nvl(T value, T default_value)

返回值:T

(3)COALESCE
返回第一非null的值,如果全部都为NULL就返回NULL

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

返回值:T

(4)case when
①如果a=b就返回c,a=d就返回e,否则返回f

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

返回值:T
②如果a=ture就返回b,c= ture就返回d,否则返回e

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

返回值:T

(5)isnull
如果a为null就返回true,否则返回false

isnull(a)

返回值:boolean

(6)isnotnull
如果a为非null就返回true,否则返回false

isnotnull(a)

返回值:boolean

7.聚合函数
count、sum、max、main、avg、var_samp等

8.表生成函数:输出可以作为表用
(1)explode
①对于array中的每个元素生成一行且包含该元素

explode(array<T>)

返回值:N rows
②每行对应每个map键值对
其中一个字段是map的键,另一个字段是map的值

explode(MAP)

返回值:N rows
(2)stack
把k列转换成n行,每行有k/n个字段,其中n必须是常数

stack(INT n, v_1, v_2, ..., v_k)

返回值:N rows

(3)posexplode
与explode类似,不同的是还返回各元素在数组中的位置

posexplode(ARRAY)

返回值:N rows

(4)json_tuple
从一个JSON字符串中获取多个键并作为一个元组返回,与get_json_object不同的是此函数能一次获取多个键值

json_tuple(jsonStr, k1, k2, ...)

返回值:tuple

Hive UDF开发

当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)
1.自定义函数创建流程
编写一个 UDF,需要继承 UDF 并实现 evaluate()函数。在查询过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用 evaluate()函数。而 evaluate()处理后的值会返回给 Hive。同时用户是可以重载 evaluate 方法的。Hive 会像 Java 的方法重载一样,自动选择匹配的方法。
编程步骤:
(1)继承 org.apache.hadoop.hive.ql.UDF
(2)需要实现 evaluate 函数;evaluate 函数支持重载;
(3)在 hive 的命令行窗口创建函数
①添加jar
add jar linux_jar_path
②创建 function
create [temporary] function [dbname.]function_name AS class_name;
(4)调用函数
注:UDF 必须要有返回类型,可以返回 null,但是返回类型不能为 void;

2.自定义 UDF 案例
(1)创建一个 maven 项目,添加依赖
(2)创建一个类

package cn.myudf.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String evaluate (final String s) {
if (s == null) {
return null;
}
return s.toString().toLowerCase();
} }

(3)打成 jar 包上传到服务器/opt/jars/udf.jar
(4)将 jar 包添加到 hive 的 classpath

hive (default)> add jar /opt/datas/udf.jar;

(5)创建临时函数与开发好的 java class 关联

hive (default)> create temporary function my_lower as "cn.myudf.hive.Lower";

(6)可在 hql 中使用自定义的函数 strip

hive (default)> select ename, my_lower(ename) lowername from emp;

3.自定义永久函数
(1)上传jar到hdfs

[root@lyx2 ~]# hadoop fs -put addPrefix.jar /opt/datas

(2)创建永久函数

create function add_prefix
as 'com.test.AddPrefix'
using jar 'hdfs:///opt/datas/addPrefix.jar'

(3)使用永久函数
与自定义临时函数不同,使用永久函数只能在当前数据库

hive (test)> select add_prefix('aa');
HIVE UDF Prefix:aa

(4)删除自定义永久函数

hive (test)> drop function add_prefix;

最后

以上就是壮观水壶为你收集整理的Hive函数和UDF详解的全部内容,希望文章能够帮你解决Hive函数和UDF详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部