Hive 常用函数

news2024/11/18 11:17:06

Hive 常用函数

      • 一、常用内置函数
        • 1、空字段赋值
        • 2、CASE WHEN THEN ELSE END
        • 3、行转列
        • 4、列转行
        • 5、窗口函数(开窗函数)
        • 6、Rank
      • 二、常用日期函数
      • 三、常用取整函数
      • 四、常用字符串操作函数
      • 五、集合操作

一、常用内置函数

查看系统自带的函数
 show functions;

显示自带的函数的用法
desc function upper;

详细显示自带的函数的用法
desc function extended upper;

1、空字段赋值

NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value)。如果value为NULL,则返回default_value的值,否则返回value的值。

2、CASE WHEN THEN ELSE END

求出不同部门男女各多少人。结果如下:

select 
  dept_id,
  sum(case sex when '男' then 1 else 0 end) male_count,
  sum(case sex when '女' then 1 else 0 end) female_count
from emp_sex
group by dept_id;

3、行转列

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。separator为参数间的分隔符。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。
注意: CONCAT_WS must be "string or array

COLLECT_SET(col):,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。COLLECT_SET函数只接受基本数据类型。

collect_list(): 汇总

4、列转行

EXPLODE(col):将array或者map结构拆分成多行。
LATERAL VIEW : 侧写表(虚拟表)

LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

示例:
在这里插入图片描述

SELECT movie,category_name 
FROM movie_info 
lateral VIEW
explode(split(category,",")) movie_info_tmp  AS category_name ;

5、窗口函数(开窗函数)

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的改变而变化。

CURRENT ROW:当前行
n PRECEDING:往前n行数据
n FOLLOWING:往后n行数据

UNBOUNDED:起点,
UNBOUNDED PRECEDING 表示从前面的起点,
UNBOUNDED FOLLOWING表示到后面的终点

LAG(col,n,default_val):往前第n行数据
LEAD(col,n, default_val):往后第n行数据

NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

(1) 查询在2017年4月份购买过的顾客及总人数

select name,count(*) over () 
from business 
where substring(orderdate,1,7) = '2017-04' 
group by name;

(2) 查询顾客的购买明细及月购买总额

select name,orderdate,cost,
sum(cost) over(partition by month(orderdate)) 
from business;

(3) 将每个顾客的cost按照日期进行累加

select name,orderdate,cost, 
sum(cost) over() as sample1,--所有行相加 
sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加 
sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加 
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行 
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行 
from business;

注意:
rows必须跟在Order by 子句之后,对排序的结果进行限制,使用固定的行数来限制分区中的数据行数量

(4) 查看顾客上次的购买时间

select name,orderdate,cost, 
lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1, lag(orderdate,2) over (partition by name order by orderdate) as time2 
from business;

含义:LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值

第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

(5) 查询前20%时间的订单信息

select * from (
    select name,orderdate,cost, ntile(5) over(order by orderdate) sorted
    from business
) t
where sorted = 1;

总结:

  • over(): 会为每条数据都开启一个窗口. 默认的窗口大小就是当前数据集的大小.

  • over(partition by …) : 会按照指定的字段进行分区, 将分区字段的值相同的数据划分到相同的区。
    每个区中的每条数据都会开启一个窗口.每条数据的窗口大小默认为当前分区数据集的大小.

  • over(order by …) : 会在窗口中按照指定的字段对数据进行排序.
    会为每条数据都开启一个窗口,默认的窗口大小为从数据集开始到当前行.

  • over(partition by … order by …) :会按照指定的字段进行分区,
    将分区字段的值相同的数据划分到相同的区,
    在每个区中会按照指定的字段进行排序.
    会为每条数据都开启一个窗口,默认的窗口大小为当前分区中从数据集开始到当前行.

  • over(partition by … order by … rows between … and …) :
    指定每条数据的窗口大小.

关键字:

  order by :       全局排序 或者 窗口函数中排序.
  partition by :   窗口函数中分区
  distribute by :  分区 
  sort by :        区内排序
  cluster by :     分区排序, 等价于 distribute by + sort by
  partitioned by : 建表指定分区字段
  clustered by :   建表指定分桶字段

6、Rank

RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算

select name,
subject,
score,
rank() over(partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subject order by score desc) rmp
from score;

二、常用日期函数

  1. unix_timestamp:返回当前或指定时间的时间戳
select unix_timestamp();
select unix_timestamp("2020-10-28",'yyyy-MM-dd');
  1. from_unixtime:将时间戳转为日期格式
select from_unixtime(1603843200);
  1. current_date:当前日期
select current_date;
  1. current_timestamp:当前的日期加时间
select current_timestamp;
  1. to_date:抽取日期部分
select to_date('2020-10-28 12:12:12');
  1. year:获取年
select year('2020-10-28 12:12:12');
  1. month:获取月
select month('2020-10-28 12:12:12');
  1. day:获取日
select day('2020-10-28 12:12:12');
  1. hour:获取时
select hour('2020-10-28 12:13:14');
  1. minute:获取分
select minute('2020-10-28 12:13:14');
  1. second:获取秒
select second('2020-10-28 12:13:14');
  1. weekofyear:当前时间是一年中的第几周
select weekofyear('2020-10-28 12:12:12');
  1. dayofmonth:当前时间是一个月中的第几天
select dayofmonth('2020-10-28 12:12:12');
  1. months_between: 两个日期间的月份
select months_between('2020-04-01','2020-10-28');
  1. add_months:日期加减月
select add_months('2020-10-28',-3);
  1. datediff:两个日期相差的天数
select datediff('2020-11-04','2020-10-28');
  1. date_add:日期加天数
select date_add('2020-10-28',4);
  1. date_sub:日期减天数
select date_sub('2020-10-28',-4);
  1. last_day:日期的当月的最后一天
select last_day('2020-02-30');
  1. date_format(): 格式化日期
select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');

三、常用取整函数

round: 四舍五入

select round(3.14);
select round(3.54);

ceil: 向上取整

select ceil(3.14);
select ceil(3.54);

floor: 向下取整

select floor(3.14);
select floor(3.54);

四、常用字符串操作函数

.upper: 转大写

select upper('low');

lower: 转小写

select lower('low');

length: 长度

select length("atguigu");

trim: 前后去空格

select trim(" atguigu ");

lpad: 向左补齐,到指定长度

select lpad('atguigu',9,'g');

rpad: 向右补齐,到指定长度

select rpad('atguigu',9,'g');

regexp_replace:使用正则表达式匹配目标字符串,匹配成功后替换!

SELECT regexp_replace('2020/10/25', '/', '-');

五、集合操作

size: 集合中元素的个数

select size(friends) from test3;

map_keys: 返回map中的key

select map_keys(children) from test3;

map_values: 返回map中的value

select map_values(children) from test3;

array_contains: 判断array中是否包含某个元素

select array_contains(friends,'bingbing') from test3;

sort_array: 将array中的元素排序

select sort_array(friends) from test3;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AcWing】学了一坤时才明白的一道题

🎆音乐分享 (点击链接可以听哦) The Right Path - Thomas Greenberg 这道题小吉花了一坤时才弄明白,虽然花的时间有点长 但是至少是明白了 😎😎😎😎😎😎 …

Java程序占用CPU过高排查

使用 top 命令查看高CPU进程,执行命令后可以按 1 键查看各CPU 内核负载情况。CPU使用率主要看us、sy两个指标。假设 10760 是一个高CPU的进程。使用 top -H -p 查看 10760 的线程信息top -H -p 10760TIME列就是各个Java线程耗费的CPU时间。以线程ID 10952的线程为例…

Msyql聚簇索引和非聚簇索引

前提MySQL索引一直是面试中的常客,一提起索引,很多人都能答出来我知道Hash索引和B树索引,Hash是比较简单的,那么B树索引就有点复杂了。在创建表的时候,我们可以看到引擎有MyISAM , InnoDB等等,这两种是我们…

ARM uboot 的移植3 -从 uboot 官方标准uboot开始移植

一、选择合适的官方原版 uboot 1、官方原版 uboot 的版本 (1) 版本号。刚开始是 1.3.4 样式,后来变成 2009.08 样式。 (2) 新版和旧版的差别。uboot 的架构很早就定下来了,然后里面普遍公用的东西(common 目录下、drivers 目录下、fs 目录…

CSS快速入门

文章目录一、CSS是什么?语法规范引入方式二、CSS选择器标签选择器类选择器ID选择器通配符选择器后代选择器子选择器并集选择器伪类选择器三、常见元素属性字体属性文本属性背景属性圆角矩形元素的显示默认块级与行级元素盒子模式去除浏览器默认样式弹性布局一、CSS是…

JUC并发编程共享模型之管程(三)(中)

4.5Monitor概念 Java 对象头 以 32 位虚拟机为例(在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit) 普通对象 数组对象 其中Mark Word 结构为…

2019年MathorCup数学建模C题汽配件制造业中的生产排程问题解题全过程文档及程序

2019年第九届MathorCup高校数学建模挑战赛 C题 汽配件制造业中的生产排程问题 原题再现: 整体求解过程概述(摘要) 随着市场竞争日趋激烈,企业开始更加注重低费高效,因此生产排程问题成为众多制造企业关注的热点之一。其中,制造行…

源码剖析Spring MVC如何将请求映射到Controller?

文章目录一、前言二、核心链路分析1、确定请求映射的入口1)HandlerMapping注入Spring容器2)HandlerMethod注册到MappingRegistry1> 判断Class是否为一个Handler2> 解析Class中的所有HandlerMethod 并注册到MappingRegistry中2、请求路径匹配1&…

【JavaScript速成之路】JavaScript函数

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言1,函数基础1.1,函数概念1.2,函数使用1.3&…

sHMIctrl 曲线控件使用

目录 效果 官方介绍 ​编辑 名词解释 使用方法 显示点 点在X轴位置 点在Y轴位置 量程 单位 如何设置自动标尺数据 设置量程 设置单位 效果 官方介绍 名词解释 四条曲线:同时最多使用4条曲线。 每条条曲线最多512点:X2-X1-Xn; 数据自定…

认识CSS值如何提高写前端代码的效率

🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…

Spring注解开发之组件注册(一)

Spring注解开发 Spring注解开发之组件注册下半篇 IOC,中文名为控制反转,是将Java的bean对象存储在容器中,当需要使用时,通过名字获取该对象。而不是通过new关键字去创建。 1.Configuration & Bean给容器中注册组件 第一种&…

K_A16_003 基于STM32等单片机采集薄膜压力传感器参数串口与OLED0.96双显示

K_A16_003 基于STM32等单片机采集薄膜压力传感器参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明对应程序:四、部分代码说明1、接线引脚定义STM32F103C8T6薄膜压力传感器模块五、基础知识学习与相关资料下载六、视频效果展示与程序资料获取七、注意…

Allegro如何在PCB中添加层面操作指导

Allegro如何在PCB中添加层面操作指导 在用Allegro做PCB设计的时候,根据需要,会在PCB中额外添加一些额外的层面,如下图 如何添加,具体操作如下 点击Setup点击Subclasses

实在智能RPA入选中国信通院《高质量数字化转型产品及服务全景图》

近日,中国信息通信研究院“高质量数字化转型创新发展大会暨中国信通院‘铸基计划’年度峰会”在北京召开,大会上信通院揭晓了《高质量数字化转型产品及服务全景图(2022)》(以下称“全景图”)。实在智能凭借…

自己定义typescript的类型声明文件xx.d.ts

****内容预警***菜鸟新手内容,大佬请绕道,不对的请指出我们在使用typescript的使用,如果安装一个包没有相应的类型声明文件,ts的类型检查就会报错,所以我们经常会安装npm包对应的types类型声明包,比如uuid …

手把手教你安装Linux!!!

文章目录Linux简述它们的区别安装CentOS①下载CentOS②安装Linux有两种方式③下载模拟软件④安装vmware⑤创建虚拟机⑥安装操作系统Linux简述 在国内比较流行的两款Linux发行版本CentOS和ubuntu 它们的区别 ubuntu:页面更加的华丽比较漂亮,它对计算机…

【bioinfo】融合检测软件FusionMap分析流程和报告结果

文章目录写在前面FusionMap融合检测原理FusionMap与其他软比较FusionMap分析流程FusionMap结果文件说明FusionMap mono CUP设置图片来源: https://en.wikipedia.org/wiki/Fusion_gene写在前面 下面主要内容是关于RNA-seq数据分析融合,用到软件是FusionMap 【Fusion…

连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建

NebulaGraph 社区如何构建工具让 Slack、WeChat 中宝贵的群聊讨论同步到公共领域。 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通、讨论应该是透明、包容并且方便所有成员访问的。这意味着社区中的任何人都应该能够参与讨论和决策过…

编写程序:有92号和95号汽油可以选择,选择你需要的汽油,并输入需要加油的升数,点击按钮“`计算总价钱`“在div中可以得到你所需要支付的价格

需求&#xff1a; 有92号汽油和95号可以选择&#xff0c;选择你需要的汽油&#xff0c;并输入需要加油的升数&#xff0c;点击按钮"计算总价钱"在div中可以得到你所需要支付的价格。结构如下图所示&#xff1a; 详细代码如下&#xff1a; <!DOCTYPE html> &l…