[Hive]-函数篇
1.函数分类
UDF 单进单出函数
UDAF 多进单出函数(比如Count,Sum...多个记录输出一个结果)
UDTF 单进多出函数(比如explode,一个记录输出多行结果)
2.操作符
A = B(等价A == B) 值相等
A <==> B Equals(两个同时为Null为真,只有一个Null为假,否则Equals)
A <>B(等价A!=B) 不等于(同Null为假,只有一个NUll为真,否则Equals取反)
A [NOT] BETWEEN B AND C [B,C]A是否在B,C之间(包含边界B,C)
A IS [NOT] NULL A是否为Null
A [NOT] LIKE B 同MySQL Like操作符
A RLIKE B (等价A REGEXP B) 模糊匹配(正则)
A DIV B A除以B的整数部分(小数直接摄取)
3.复杂对象
map(key1, value1, key2, value2, ...) 用指定的键值创建一个Map对象
struct(val1, val2, val3, ...) 用指定的值创建一个struct对象,字段名依次为col1.col2.....
named_struct(name1, val1, name2, val2, ...) 用指定的字段名,字段值创建一个struct对象
array(val1, val2, ...) 用指定的值创建一个array对象
create_union(tag, val1, val2, ...) 使用标记参数指向的值创建一个联合类型
A[n] 获取数组对象A下标为n的值
M[key] 获取键值对对象M的键为key的值
S.x 获取结构体S的字段x的值
size(Map<K.V>) size(Array<T>) 返回Map或数组的元素个数
map_keys(Map<K.V>) 返回Map的键数组对象
map_values(Map<K.V>) 返回Map的值数组对象
array_contains(Array<T>, value) 返回Map是否包含指定的值
sort_array(Array<T>) 数组排序(升序)
4.UDF函数
4.1 数学函数
round(DOUBLE a) 返回a的四舍五入的值
round(DOUBLE a, INT d) 返回a四舍五入保留d位小数的值
bround(DOUBLE a [, INT d]) 返回a的高斯四舍五入的值
floor(DOUBLE a) 返回a向上取整的值
ceil(DOUBLE a), ceiling(DOUBLE a) 返回a向下取整的值
rand(), rand(INT seed) 返回一个随机数
greatest(T v1, T v2, ...) 返回指定值中最大的值
least(T v1, T v2, ...) 返回指定值中最小的值
4.2 类型转换函数
cast(expr as <type>) 将 expr转换为<type>类型
4.3 日期函数
from_unixtime(bigint unixtime[, string format]) 将一个时间戳转换为指定格式的字符串,默认(yyyy-MM-dd)
unix_timestamp() 获取当前时间时间戳(秒)
unix_timestamp(string date [, string pattern]) 将一个pattern格式(默认yyyy-MM-dd hh:mm:ss)的字符串转换为时间戳
to_date(string timestamp) 将一个时间戳转换为yyyy-MM-dd
quarter(date/timestamp/string) 返回日期、时间戳或范围为1到4的字符串的季度
year(string date) 返回字符串日期的年 year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970
month(string date) 返回字符串日期的月
day(string date) dayofmonth(date) 返回字符串日期的天
hour(string date) 返回字符串日期的小时
minute(string date) 返回字符串日期的分钟
second(string date) 返回字符串日期的秒
weekofyear(string date) 返回字符串日期的星期几
extract(field FROM source) 从时间source中提取属性信息
select extract(month from "2016-10-20") results in 10.
select extract(hour from "2016-10-20 05:06:07") results in 5.
select extract(dayofweek from "2016-10-20 05:06:07") results in 5.
select extract(month from interval '1-3' year to month) results in 3.
select extract(minute from interval '3 12:20:30' day to second) results in 20.
datediff(string enddate, string startdate) 返回两个日期差异的天数(记住第一个参数是结束日期,第二个参数是开始日期)
date_add(date/timestamp/string startdate, tinyint/smallint/int days) 返回指定日期加days天的日期
date_sub(date/timestamp/string startdate, tinyint/smallint/int days) 返回指定日期减去days天的日期
current_date 返回当前日期
current_timestamp 返回当前日期时间戳
4.4 条件函数
if(boolean testCondition, T valueTrue, T valueFalseOrNull) 如果testCondition表达式结果为真返回valueTrue,否则返回valueFalseOrNull
isnull( a ) 返回a是否为Null
isnotnull ( a ) 返回a是否不会Null
nvl(T value, T default_value) 如果value不为Null则返回value,否则返回default_value
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 如果a为真返回b 否则c
4.5 字符串函数
character_length(string str) 返回字符串在UTF8编码下的长度
concat(string|binary A, string|binary B...) 多个字符串拼接
concat_ws(string SEP, string A, string B...) 多个字符串拼接,中间用SEP连接
split(string str, string pat) 字符串用pa分割成多段数组
substr(string|binary A, int start [, int len]) 字符串从start之后截取[len位], 从1开始, substr('foobar', 4) = 'bar'
6. UDTF函数
UDTF函数语法限制:
使用UDTF函数,不能再跟上其它的表达式 (禁止 UDTF(),其它列或表达式)
UDTF函数不能再嵌套使用其它的UDTF函数
UDTF函数不能再使用GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY
常用UDTF函数
explode(ARRAY<T> a) 将一个数组对象转换为多行记录,每行记录一列
explode(MAP<Tkey,Tvalue> m) 将一个Map对象转换为多行记录,每行记录有两列,[key,value]
posexplode(ARRAY<T> a) 将一个数组对象转换为多行记录.每行记录有两列,[数组下标,值]
inline(ARRAY<STRUCT<f1:T1,...,fn:Tn>> a) 将一个数组结构体对象转换为多行记录,每行记录的列对应结构体的属性
stack(int r,T1 V1,...,Tn/r Vn)
json_tuple(string jsonStr,string k1,...,string kn) 将一个Json字符串转换为多行数据,每行记录的列来自后续列指定k1...kn(只有后续指定的列才会读取)
parse_url_tuple(string urlStr,string p1,...,string pn) 将一个URL地址字符串解析成单行多列信息
parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1','HOST', 'PATH', 'QUERY', 'QUERY:k1', 'QUERY:k2')
facebook.com /path1/p.php k1=v1&k2=v2 v1 v2
7. UDAF函数
sum() count()......
更多函数见官网 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
8.开窗函数
8.1 OVER 字句
OVER 字句,可以使用在所有的标准聚合函数中(COUNT,SUM,MIN,MAX,AVG),或者特有分析函数(RANK|ROW_NUMBER.....),并且在2.1.0之后,支持DISTINCT关键字和Over字句内嵌套标准聚合函数
[COUNT|SUM|MIN|MAX|AVG|......] OVER ( PARTITION BY <字段A....> ORDER BY <字段A....> [DESC])
PARTITION BY 字段,表示按字段分组 后续 ORDER BY 字段 表示分组内按字段排序
8.2 示例
COUNT
(
DISTINCT
a) OVER (PARTITION
BY
c) 按c分组后,在每个分组内对a执行去重计数
select* from (
select name,dept,age row_number() over (patition by
dept order by age) as idx from employee
) as t where t.idx <=2 查询每个部门的成员中年级最小的两位
8.自定义函数
8.1 函数的定义
所有Hive的函数都是继承UDF类的Java子类.自定义函数就是实现UDF类,并将jar注册到Hive的过程.
1.Maven导入 hive-exec hadoop-common,
2.定义一个类继承UDF,并实现需要的evaluate方法
8.2 注册到Hive
注意函数名注册最好才采用全小写+_形式,因为函数名会全部转为小写,会失去驼峰
8.2.1 临时函数
临时函数随会话相关,所以创建的函数可以用在任意数据库中,但会话切换就会立即失败
8.2.1.1 jar注册
临时注册 add jar jar本地路径
永久注册 将jar拷贝到Hive的lib文件夹(需要重启hive)
8.2.1.2 临时函数注册
CREATE TEMPORARY FUNCTION function_name AS "class_name(类的全名:包+类名)";
8.2.2 永久函数注册
永久函数随数据库相关,作为数据库元数据的一部分,所以切换会话仍可使用,但必须显示声明所处的数据库
永久函数的Jar文件是必须放入HDFS的.
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE
'file_uri'
[, JAR|FILE|ARCHIVE
'file_uri'
] ];
8.3 函数的删除
DROP [TEMPORARY] FUNCTION [IF EXISTS] function_name;
8.4 函数的注册机制以及自动注册
Hive的函数注册其实是FunctionRegistry类的结果.
默认函数也是要基于同样的注册流程.之所以默认函数不注册,是因为FunctionRegistry的静态方法实现了默认函数的自动注册
如果需要实现自动注册,照此执行即可(需要编辑源码重新编译Hive哦)
转载于:https://www.cnblogs.com/NightPxy/p/9153255.html
[Hive]-函数篇相关推荐
- Hive 高级篇(调优)
Hive 高级篇 1. Hive 数据存储格式(数据压缩) 1.1 Hive 数据压缩 1.2 Hive 开启数据压缩 1.3 数据存储格式--行式存储 1.4 数据存储格式--列式存储 1.5 存储 ...
- 来学习几个简单的Hive函数吧!
作者 | 石晓文 转载自小小挖掘机(ID:wAIsjwj) 咳咳,今天来介绍一下几个Hive函数吧,先放一张我登哥划水的照片,希望大家也做一只自由的鱼儿,在知识的海洋里游呀游,嘻嘻! 今天我们来介绍几 ...
- PHP函数篇之掌握ord()与chr()函数应用
ord()函数把字符转换为十进制数字,chr()函数把十进制数字转化为字符,在二进制,八进制,十进制与十六进制之间充当桥梁的作用 中文字符编码研究系列第三期,PHP函数篇掌握ord()与 chr()函 ...
- Python函数篇(5)-装饰器及实例讲解
1.装饰器的概念 装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式 装饰器可以简单的理 ...
- hive内置函数_flink教程flink modules详解之使用hive函数
modules概念 通过hive module使用hive函数 内置函数 自定义函数 sql 客户端的使用 原理分析和源码解析 实现 modules概念 flink 提供了一个module的概念,使用 ...
- hive 函数 Cube
hive 函数 Cube 最近在优化一个报表系统.leader 提示我可以用cube函数.在此记录一下使用: 1) cube 简称数据魔方. 可以实现hive多个任意维度的查询. cube(a,b,c ...
- circle后面是什么意思 python_python小课堂16 - 函数篇
前言 函数篇 ------ 说起函数,大家高中应该都学过类似的概念,函数指一个量随着另一个量的变化而变化,而在编程中,函数的概念则不尽相同.举个例子,比如打过dota的同学都知道,在dota中通过sh ...
- html5 判断分享,好程序员HTML5大前端分享之函数篇
好程序员HTML5大前端分享之函数篇,将代码编写在函数中,就可以避免在非必要情况下调用该代码,也就是说我们可以让一段代码在特定情况下再去执行. function 关键字:该关键字表示要声明一个函数. ...
- 来学习几个简单的Hive函数啦
全文共454个字,3张图,预计阅读时间5分钟. 咳咳,今天来介绍一下几个Hive函数吧,先放一张我登哥划水的照片,希望大家也做一只自由的鱼儿,在知识的海洋里游呀游,嘻嘻! 今天我们来介绍几个Hive常 ...
最新文章
- 代码段、数据段、bss段
- 不同平台上安装python一样吗_在多个平台如何安装Python
- 浅谈Delphi过程与函数02 - 零基础入门学习Delphi21
- 手机的小窗口怎么弄_做一个表白小程序
- adb shell 调试 Android 串口
- mysql建立索引 有什么缺陷_MySQL数据库建立索引的优缺点以及什么样的字段适合建立索引...
- pandas保存为excel,同时设置保存的excel的样式
- 滚动页面一定距离后固定导航条
- 数据库原理—SQL数据定义功能(九)
- 初识Python(二)
- apache2.2+PHP5.2.3+mysql5.0+gd+zend+phpmyadmin
- 使用Dism++安装系统(新手勿尝试)
- webservice接口开发学习笔记(一)
- 数的变幻(小明买书)
- Java课程设计报告--绩效考核信息管理系统
- 华三交换机 RRPP V7版本
- 【NOIP 2018 提高组】填数游戏
- 获奖团队访谈录|“AI+无线通信”赛道三等奖团队
- 毕业设计时如何搜集相关资料等问题解答
- 高质量 iOS 博客推荐(iOS界技术大牛)