概述
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详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复