【Hive】函数(UDF篇)
UDF函数可以直接应用于select语句,对查询结构做格式化处理输出内容。自定义UDF需要继承org.apache.hadoop.hive.ql.UDF,实现evaluate函数。
自定义udf函数步骤:
- 1.继承UDF类
- 2.重写evaluate方法
- 3.把项目打成jar包
- 4.hive中执行命令add jar /home/jrjt/dwetl/PUB/UDF/udf/GetProperty.jar;
- 5.创建函数create temporary function get_pro as 'jd.Get_Property'//jd.jd.Get_Property为类路径;
永久udf函数创建:
- 1、hdfs dfs -put udftimestamp.jar /udf/
- 2、add jar hdfs://nameservice1:8020/udf/udftimestamp.jar;
- 3、CREATE FUNCTION dm_lots.udftimestamp AS 'mytimestamp.MyUDFTimestamp' using jar 'hdfs://nameservice1:8020/udf/udftimestamp.jar';
删除udf函数
drop function dm_lots.udftimestamp;
查看udf函数
show functions
例1:日志切割
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;public class SalaryUDF extends UDF{public Text evaluate(Text salaryText){//1.if salary is nullif (salaryText == null) {return null;}String salaryStr = salaryText.toString();//2.if salary is not double typedouble salary = 0.0;try {salary = Double.valueOf(salaryStr);} catch (NumberFormatException e) {e.printStackTrace();return null;}Text text = new Text();//3.panduan salary return string if (salary > 10000) {text.set("you are rich");return text;}else if (salary <= 10000 && salary > 5000) {text.set("income is normal");return text;}else {text.set("income is pool");return text;}}
}
例2:日期转化
package com.rainbow.udf;import java.text.SimpleDateFormat;
import java.util.Date;import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;public class TestDate extends UDF{private SimpleDateFormat inputdateFormat = new SimpleDateFormat("dd/MM/yyyy:HH:mm:ss",locale.ENLISH);private SimpleDateFormat outputdateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");public Text exvaluate(Text input){Text output = new Text();if(null==input){return null;}if(null==input.toString()){return null;}try {String inputDate=input.toString().trim();Date perseDate = inputdateFormat.parse(inputDate);String outputDate = outputdateFormat.format(perseDate);output.set(outputDate);}catch(Exception e){e.printStackTrace();return output;}return output;}
}
打jar包
上传到hdfs
CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE'file_uri' [, JAR|FILE|ARCHIVE'file_uri'] ];
【Hive】Hive常用函数(UDF篇)
Hive的函数分为三类,分别是UDF、UDAF、UDTF,简单区分这三类函数就是,UDF是单行输入,单行输出;UDAF是多行输入,单行输出;UDTF是单行输入,多行或多列输出。
另:所有的hive函数,都可以使用desc function 函数名
查看使用方法,若想查看更详细的使用方法,则可以使用desc function extended 函数名
UDF
字符串类
返回值类型 | 用法 | 描述 |
---|---|---|
string | concat(string|binary A, string|binary B...) | 拼接多个字符串 |
string | concat_ws(string SEP, string A, string B...) | 拼接多个字符串并按指定分隔符拼接 |
string | concat_ws(string SEP, array) | 另一种用法,可以直接拼接数组的元素 (as of Hive 0.9.0) |
string | decode(binary bin, string charset) | 从 (one of 'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'). 中指定解码格式,解码二进制 (As of Hive 0.12.0.) |
string | elt(N int,str1 string,str2 string,str3 string,...) | 示例:elt(2,'hello','world') 返回 'world'. |
binary | encode(string src, string charset) | 从 (one of 'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'). 指定编码格式,编码字符串. (As of Hive 0.12.0.) |
int | field(val T,val1 T,val2 T,val3 T,...) | 示例: field('world','say','hello','world') 返回 3. 否则返回 0 |
int | find_in_set(string str, string strList) | 示例:find_in_set('ab', 'abc,b,ab,c,def') 返回 3,参数是null返回null,没找到返回 0 |
string | get_json_object(string json_string, string path) |
示例:get_json_object('{"name":"zs","id":"2"}','$.id') 返回 2 get_json_object('{"name":"zs","id":"2"}','$.name') 返回 zs |
int | instr(string str, string substr) |
示例:instr('substr', 'str') 返回 4, instr('substr', 'astr') 返回 0 参数带null返回null |
int | length(string A) | 返回字符串长度 |
string | lower(string A) lcase(string A) | 字符串转小写,示例:lower('fOoBaR') 返回 'foobar'. |
string | lpad(string str, int len, string pad) |
字符串左补齐,示例:lpad('str', 5, '0') 返回 00str lpad('str', 2, '0') 返回 st 参数带null返回null |
string | ltrim(string A) | 字符串去空格 ,示例:ltrim(' foobar ') 返回 'foobar '. |
string | regexp_extract(string subject, string pattern, int index) | 字符串则模板提取,示例:regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 返回 bar |
string | regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) | 字符串正则替换,示例:regexp_replace("foobar", "oo|ar", "") 返回 'fb.' |
string | repeat(string str, int n) | 重复字符串,示例:repeat('str', 2) 返回 strstr |
string | replace(string A, string OLD, string NEW) | 字符串替换,示例:replace("ababab", "abab", "Z")返回 "Zab". |
string | reverse(string A) | 字符串翻转 |
string | rpad(string str, int len, string pad) | 字符串右补齐 |
string | rtrim(string A) | 字符串去空格 示例:rtrim(' foobar ') results in ' foobar'. |
string | space(int n) | 返回一个 n 个空格的字符串 |
array | split(string str, string pat) | 指定分隔符分割字符串,返回数组 |
map | str_to_map(text[, delimiter1, delimiter2]) | 指定两个分隔符分割字符串,返回map,默认元素分隔符 ',' 默认键值分隔符 ':' |
string | substr(string|binary A, int start) substring(string|binary A, int start) | 字符串截取 示例:substr('foobar', 4) 返回 'bar' |
string | substr(string|binary A, int start, int len) substring(string|binary A, int start, int len) | 字符串截取,另一种用法 示例:substr('foobar', 4, 1) 返回 'b' |
string | substring_index(string A, string delim, int count) | 字符串截取,示例: substring_index('www.apache.org', '.', 2) 返回'www.apache'. |
string | translate(string|char|varchar input, string|char|varchar from, string|char|varchar to) | 字符串替换,可做到字符级别,示例:translate('abcdeab', 'abc', 'olcc') 返回 olcdeol |
string | trim(string A) | 字符串去空格 示例:trim(' foobar ') 返回 'foobar' |
string | upper(string A) ucase(string A) | 字符串转大写 示例 upper('fOoBaR') 返回 'FOOBAR'. |
日期类
返回值类型 | 用法 | 描述 |
---|---|---|
string | from_unixtime(bigint unixtime[, string format]) | Unix时间戳(秒)转格式化日期 |
bigint | unix_timestamp(string date) | 格式为uuu MM-dd HH:MM:ss的时间字符串转换为Unix时间戳(秒) |
bigint | unix_timestamp(string date, string pattern) | 指定时间格式转换为Unix时间戳(秒) |
pre 2.1.0: string2.1.0 on: date | to_date(string timestamp) | 返回字符串的日期 示例: to_date("1970-01-01 00:00:00") = "1970-01-01". |
int | year(string date) | 返回年份,示例:year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970. |
int | quarter(date/timestamp/string) | 返回季度,示例:quarter('2015-04-08') = 2. (as of Hive 1.3.0). |
int | month(string date) | 返回月份,示例:month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11. |
int | day(string date) dayofmonth(date) | 返回日期,示例: day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1. |
int | hour(string date) | 返回小时,示例:hour('2009-07-30 12:58:59') = 12, hour('12:58:59') = 12. |
int | minute(string date) | 返回分钟 |
int | second(string date) | 返回秒数 |
int | weekofyear(string date) | 返回日期在对应年份的周数,示例: weekofyear("1970-11-01 00:00:00") = 44, weekofyear("1970-11-01") = 44. |
int | extract(field FROM source) |
支持的第三个参数 date格式, timestamp格式, interval 或 一个date或timestamp的格式字符串. 支持的第一个参数: day, dayofweek, hour, minute, month, quarter, second, week and year. 示例:select extract(month from "2016-10-20") 返回 10. select extract(hour from "2016-10-20 05:06:07")返回 5. select extract(dayofweek from "2016-10-20 05:06:07") 返回 5. select extract(month from interval '1-3' year to month) 返回 3. select extract(minute from interval '3 12:20:30' day to second) 返回 20. |
int | datediff(string enddate, string startdate) | 计算日期差值,示例: datediff('2009-03-01', '2009-02-27') = 2. |
pre 2.1.0: string2.1.0 on: date | date_add(date/timestamp/string startdate, tinyint/smallint/int days) | 日期增加天数,示例: date_add('2008-12-31', 1) = '2009-01-01'.Prior to Hive 2.1.0 (HIVE-13248) |
pre 2.1.0: string2.1.0 on: date | date_sub(date/timestamp/string startdate, tinyint/smallint/int days) | 日期减少天数,示例: date_sub('2008-12-31', 1) = '2008-12-30'.Prior to Hive 2.1.0 (HIVE-13248) |
timestamp | from_utc_timestamp({any primitive type} ts, string timezone) | 将UTC时间戳转换为指定时区的timestamp格式 (as of Hive 0.8.0).示例: from_utc_timestamp(2592000.0,'PST'), from_utc_timestamp(2592000000,'PST') and from_utc_timestamp(timestamp '1970-01-30 16:00:00','PST') 返回 timestamp 1970-01-30 08:00:00. |
date | current_date | 返回当前的日期 (as of Hive 1.2.0) |
timestamp | current_timestamp | 返回当前的时间 (as of Hive 1.2.0) |
string | add_months(string start_date, int num_months, output_date_format) |
日期增加月数,示例: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'. |
string | last_day(string date) | 返回日期所在月的最后一天 (as of Hive 1.1.0). 示例:last_day('2022-10-01') 返回 2022-10-31 |
string | next_day(string start_date, string day_of_week) | 返回日期下一周的星期几日期,示例: next_day('2015-01-14', 'TU') = 2015-01-20. |
string | trunc(string date, string format) | 返回指定格式的日期值(as of Hive 1.2.0). 支持的格式: MONTH/MON/MM, YEAR/YYYY/YY. 示例: trunc('2015-03-17', 'MM') = 2015-03-01. |
double | months_between(date1, date2) | 返回两个日期之间的月数,示例:months_between('1997-03-30', '1997-10-30') = 7 |
string | date_format(date/timestamp/string ts, string fmt) | 格式化日期,支持的格式 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html. 示例: date_format('2015-04-08', 'y') = '2015' |
集合类
返回值类型 | 用法 | 描述 |
---|---|---|
int | size(Map) | 返回Map的元素个数 |
int | size(Array) | 返回数组的的元素个数 |
array | map_keys(Map) | 以数组的形式返回,Map的所有key |
array | map_values(Map) | 以数组的形式返回,Map的所有value |
boolean | array_contains(Array, value) | 如果数组包含对应值的元素返回true,否则返回false |
array | sort_array(Array) | 将数组元素按升序排序后返回 |
条件类
返回值类型 | 用法 | 描述 |
---|---|---|
T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 对一个返回值是boolean类型的表达式进行判断,如果返回值是true就返回 第二个值,其它情况返回第三个值 |
boolean | isnull( a ) | 判空,null值返回true,否则返回false |
boolean | isnotnull ( a ) | 判非空,非null值返回true,否则返回false |
T | nvl(T value, T default_value) | 两个值,如果第一个值是null则返回第二个值,否则返回第一个值 (as of HIve 0.11). |
T | COALESCE(T v1, T v2, ...) | 上面函数的多值情况,如果前面值为null则取后面的值,可以一直判断下去直到取到非null值 |
T | CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END | case when的一种写法,建议必加else |
T | CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END | case when的一种写法,建议必加else,推荐 |
T | nullif( a, b ) | 相当于CASE WHEN a=b THEN NULL else a (as of Hive 2.3.0) |
void | assert_true(boolean condition) | 表达式结果是true则返回null,否则报错 (as of Hive 0.8.0). 示例: select assert_true (2<1),报错信息:java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: ASSERT_TRUE(): assertion failed. |
Hive官网UDF
【Hive】函数(UDF篇)相关推荐
- 【若泽大数据实战第十九天】Hive 函数UDF开发以及永久注册udf函数
前言: 回顾上期课程,上次课我们讲了聚合函数,多进一出, 分组函数 group by,出现在select里面的字段除了分组函数之外,其他都要出现在group by里面,分组函数的过滤必须使用hivi ...
- Hive 函数UDF开发以及永久注册UDF函数
explode: (把一串数据转换成多行的数据) 创建一个文本: [hadoop@ruozehadoop000 data]$ vi hive-wc.txt hello,world,welcome he ...
- hive 的udf 函数使用
1)依据课程讲解UDF编程案例,完成练习,总结开发UDF步骤,代码贴图,给予注释,重点 2)更改emp 表中名字的大写给为小写. 一:hive 的udf 函数: 1.1 hive UDF 函数概述: ...
- Hive自定义UDF和聚合函数UDAF
2019独角兽企业重金招聘Python工程师标准>>> 转自:http://computerdragon.blog.51cto.com/6235984/1288567 Hive是一种 ...
- [Hive]-函数篇
1.函数分类 UDF 单进单出函数 UDAF 多进单出函数(比如Count,Sum...多个记录输出一个结果) UDTF 单进多出函数(比如explode,一个记录输出多行结果) 2.操作符 A = ...
- Hive内置运算函数,自定义函数(UDF)和Transform
4.Hive函数 4.1 内置运算符 内容较多,见<Hive官方文档> 4.2 内置函数 内容较多,见<Hive官方文档> https://cwiki.apache.org ...
- hive最新UDF函数(2016-10-25)
为什么80%的码农都做不了架构师?>>> hive UDF函数 :(后期翻译,暂时先贴着,有兴趣来 http://apache.wiki 可以一起来翻译呀) https:// ...
- java版hive的UDF(临时函数与永久函数)
文章目录 1.生产测试数据 2.开启hive 3.远程连接hive(可以直接hive) 4.编写代码 5.编译 6.注册临时函数UDF 6.1 删除临时函数 7.注册临时函数UDF,使用hdfs 8. ...
- hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...
如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...
最新文章
- 给定一个字符串,输出第一次出现k次的字母java,c++实现
- 你必须知道的指针基础-3.指针的移动及指针的危险
- ndtmapping建图_自动驾驶系列:激光雷达建图和定位(NDT)
- 下载 | 9G火爆的Python爬虫教程+ 520页《图解机器学习》
- How to get ABAP code coverage result
- java 根据类名示例化类_Java即时类| getEpochSecond()方法与示例
- 如何在矩池云上运行FinRL-Libray股票交易策略框架
- C#Winform频繁刷新导致界面闪烁解决方法
- github fork别人项目后如何同步更新原项目
- [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
- 解决办法:av_interleaved_write_frame()返回-22 错误
- 无线充电手机 协议 c语言,这款无线充电器仅69元?支持Qi协议
- 学Java看什么视频好呢?视频经验大总结
- iOS 百度地图与高德地图经纬度转换(坐标转换)
- xposed+JustTrustMe抓包SSLping
- 基于有道API的命令行词典(golang版)
- 多项创新功能驱动,Galaxy S9必将引爆2018智能手机市场
- 芝士合集(以便查看)
- 洛达1562A空间音频固件(艾创立11月12月+豪锐11月)
- Java二维码工具类(超详细注释)