首页 > 其他分享 >Hive用户定义函数 [单列函数UDF | 聚合函数UDAF]

Hive用户定义函数 [单列函数UDF | 聚合函数UDAF]

时间:2024-08-28 10:25:47浏览次数:3  
标签:返回 聚合 函数 int Hive UDAF 字符串 string

Hive中函数有4类:单行函数、聚合函数、炸裂函数、窗口函数

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

按输入行数与输出行数的对应关系:

  • UDF:普通函数,一进一出
  • UDAF:聚合函数,多进一出
  • UDTF:表生成函数,一进多出,如输入一行array类型,返回3行string类型

一、单列函数(UDF-一进一出)

1、字符串函数

返回值 函数 描述
string concat(string/binary A, string/binary B…) 对二进制字节码或字符串按次序进行拼接
int instr(string str, string substr) 查找字符串str中子字符串substr出现的位置
int length(string A) 返回字符串的长度
int locate(string substr, string str[, int pos]) 查找字符串str中的pos位置后字符串substr第一次出现的位置
string lower(string A) /upper(string A) 将字符串A的所有字母转换成小写/大写字母
string regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) 按正则表达式PATTERN将字符串中符合条件的部分替换成REPLACEMENT所指定的字符串
array split(string str, string pat) 按照正则表达式pat来分割字符串str
string substr(string/binary A, int start, int len)substring(string/binary A, int start, int len) 对字符串A,从start位置开始截取长度为len的字符串并返回
string trim(string A) 将字符串A前后出现的空格去掉
map str_to_map(text[, delimiter1, delimiter2]) 将字符串str按照指定分隔符转换成Map
binary encode(string src, string charset) 用指定字符集charset将字符串编码成二进制值
string concat_ws(separator,string A, string B…) 用指定拼接符separator对字符串按次序进行拼接

2、类型转换函数

返回值 函数 描述
“type” cast(expr as ) 将expr转换成type类型 如:cast(“1” as BIGINT) 将字符串1转换成了BIGINT类型
binary binary(string/binary) 将输入的值转换成二进制

3、数学函数

返回值 函数 描述
DOUBLE round(DOUBLE a) 返回对a四舍五入的BIGINT值
binary round(DOUBLE a, INT d) 返回对a四舍五入并保留d位小数位的值
BIGINT floor(DOUBLE a) 向下取整,如:6.10->6 -3.4->-4
DOUBLE rand(INT seed) 返回一个DOUBLE型随机数,seed是随机因子
DOUBLE power(DOUBLE a, DOUBLE p) 计算a的p次幂
DOUBLE abs(DOUBLE a) 计算a的绝对值

4、日期函数

返回值 函数 描述
string from_unixtime(bigint unixtime[, string format]) 将时间戳转换成format格式
int unix_timestamp() 获取本地时区下的时间戳
bigint unix_timestamp(string date) 将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳
string to_date(string timestamp) 返回时间字符串的日期部分
int year(string date) month/day/hour/minute/second/weekofyear 返回时间字符串的年份部分 返回月/天/时/分/秒/第几周
int datediff(string enddate, string startdate) 计算开始时间到结束时间相差的天数
string date_add(string startdate, int days) 从开始时间startdate加上days
string date_sub(string startdate, int days) 从开始时间startdate减去days
date current_date 返回当前时间的日期
timestamp current_timestamp 返回当前时间戳
string date_format(date/timestamp/string ts, string fmt) 按指定格式返回时间date 如:date_format(“2016-06-22”,“MM-dd”)=06-22

5、集合函数

返回值 函数 描述
int size(Map<K.V>) 返回map中键值对个数
int size(Array) 返回数组的长度
array map_keys(Map<K.V>) 返回map中的所有key
array map_values(Map<K.V>) 返回map中的所有value
boolean array_contains(Array, value) 如该数组Array包含value返回true,否则返回false
array sort_array(Array) 对数组进行排序

6、条件函数

返回值 函数 描述
T if(boolean testCondition, T valueTrue, T valueFalseOrNull) 如果testCondition为true就返回valueTrue,否则返回valueFalseOrNull
T nvl(T value, T default_value) value为NULL返回default_value,否则返回value
T COALESCE(T v1, T v2, …) 返回第一非null的值,如果全部都为NULL就返回NULL
T CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 如果a=b就返回c,a=d就返回e,否则返回f
T CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END]* [ELSE f] END 如果a=ture就返回b,c= ture就返回d,否则返回e
boolean isnull(a) 如果a为null就返回true,否则返回false
boolean isnotnull (a) 如果a为非null就返回true,否则返回false

二、聚合函数 (UDAF - 多进一出)

1、基础聚合函数:sum()、count()、max()、min()、avg()
(1)没有group by关键字就是对整个表聚合;有group by 就是对每个组聚合。

--1.分组聚合:统计男同学、女同学人数
select count(*) from student group by sex;
--2.表聚合:统计全班人数
select count(*) from student;
  • count(*)等价于count(1):统计所有行,包括含有null值的行
  • count(col):只会对col中非null进行统计。其他的基础聚合函数也一样的,对字段聚合处理,若存在该字段值为null,则忽略该行。
  • count(只能传入一个参数),如果要传入多个参数,可以count(distinct col1, col2),只要去重对结果没有影响就可以这样。

(2)聚合函数内:

  • 可以搭配if()case when ... then else endisnull()这种单列函数使用,但是聚合函数内不可搭配聚合函数
  • 先对每组数据内的所有行都执行单列函数,再对每组数据进行聚合
  • 可以搭配distinct关键字去重–>count(distinct col)
  • 聚合函数内使用struct集合数据类型,是对其第一个列操作。因此可以实现查找女生年龄最大的人的姓名
    select max(struct(age,name) from student);

2、高级聚合函数
(1)collect_list():收集并形成list集合,结果不去重
(2)collect_set():收集并形成set集合,结果去重

select 
  sex,
  collect_list(job) as job
from employee
group by sex
-- 结果:
sex			job
男	["销售"]
女	["行政","行政"]

标签:返回,聚合,函数,int,Hive,UDAF,字符串,string
From: https://www.cnblogs.com/shihongpin/p/18369884

相关文章

  • 指针(三):函数指针
    目录函数指针函数的地址函数指针结构函数指针数组了解函数指针数组函数指针数组结构简易计算器函数指针数组优化计算器函数指针函数的地址函数指针,也就是存放函数地址的变量,有人会问,函数也会有地址吗?我们用一个代码来验证一下吧。#include<stdio.h>voidtest(......
  • C:回调函数的介绍-学习笔记
    前言:本篇文章我们将继续指针相关知识:回调函数希望大家在看完后能够有所收获!回调函数 定义与概念回调函数是一个通过指针调用的函数。如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方......
  • MySQL数据库(2)——DML、视图、函数
    目录1、DML——数据操作语言(DataManipulationLanguage)2、添加数据2.1语句添加2.2文件加载3、修改数据4、删除数据5、查询数据5.1DQL基本关键字及其说明 着重号SQL简单查询5.2别名查询5.3去重查询5.4单表查询算数运算符比较运算符逻辑运算符范围......
  • vue3 自定义hooks(组合式函数)
    什么是hooks自定义hooks是Vue3组合式函数的别称。在Vue应用的概念中,“组合式函数”(Composables)是一个利用Vue的组合式API来封装和复用有状态逻辑的函数。命名规范组合式函数约定用驼峰命名法命名,并以“use”作为开头。以便识别它们是可复用的逻辑单元。例如,u......
  • 字符串函数 (总篇章,全面解析)
    文章目录1.strlen函数函数的使用:strlen的模拟实现:分法1计数法:方法2递归法:分法3指针法:2.strcpy函数strcpy的使用:strcpy的模拟实现:3.strcat函数strcat函数的使用:strcat函数的模拟现实:4.strcmp函数strcmp函数的使用:strcmp函数的模拟实现:5.strncpy函数6.strncat函数7.s......
  • 当构造与析构的函数体为空,会发生什么?
    析构函数、构造函数用来进行数据的销毁和初始化。那么系统默认生成的构造和析构有什么特点呢?构造函数对于自定义类型,会调用对应的默认构造,内置类型不做处理。当显式定义了无参的默认构造,初始化列表和函数体都为空时,也会在初始化列表阶段调用自定义类的默认构造(所有成员变量......
  • C语言字符函数和字符串函数的详解及模拟实现(超详细)
    目录1.求字符串长度1.1strlen1.1.1.strlen函数介绍1.1.2.strlen函数模拟实现 2.长度不受限制的字符串函数 2.1strcpy2.1.1.strcpy函数介绍2.1.2.strcpy函数模拟实现 2.2strcat2.2.1.strcat函数介绍2.2.2.strcat函数模拟实现 2.3strcmp 2.3.1.strcmp函数介绍......
  • C++趣味实验之:二次函数面积与微积分
    在数学中,我们可以使用微积分来计算由二次函数抛物线构成的图形根据这个原理,我们可以用程序模拟计算这些图形的面积longdoublex,y,a,b,c;首先,定义出函数的各个参数输入a,b,c的数值后,计算其数值并绘制其图像for(inti=1;i<=1000;i++){ x+=0.1; y=a*x*x; y=y+b*x; ......
  • ES6的Map函数详解
    一、Map介绍Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值Map对象是键值对的集合。Map中的一个键只能出现一次;它在Map的集合中是独一无二的。Map对象在for…of循环在每次迭代后会返回一个形式为[key,value]的数组......
  • C++学习随笔——C++仿函数的应用方法
    仿函数的基本定义仿函数(Functor),也称为函数对象(FunctionObject),是一个行为像函数的对象。实现仿函数的方法是重载类中的operator()操作符,使得对象能够像调用普通函数一样使用。仿函数的主要优势是它们可以拥有状态,并且可以被用于STL算法和容器中。简单例子:点击查看代码#in......