hive基础知识分享(二)

写在前面

今天继续学习hive部分的知识。

以下是您提供的内容转成的 Markdown 格式:

Hive 相关知识

hive中不同的 count 区别

image-20241008095935176

select clazz,count(distinct id) as cnt,count(*) as cnt,count(1) as cnt_1,count(id) as cnt_id
from students
group by clazz;

Hive 关联的分类及区别

image-20241008101637583

  • join 内连接和自连接
  • left join 左连接
  • right join 右连接
  • full outer join 全外连接
  • cross join 交叉连接(笛卡尔积)

Hive 中 wherehaving 的区别

  • where 是分组前的筛选,having 是针对分组后的进一步筛选且必须要有分组才有 having
  • where 里不能包含分组的字段和聚合函数,having 里可以使用分组字段。

Hive 中的几种排序及对比

  • order by: 全局排序

    image-20210114163527883.png

  • sort by: 局部排序

    image-20210114163546748.png

  • distribute by: 分区

    image-20210114163558443.png

  • cluster by: 分区排序

    image-20210114163608574.png

Hive 怎么实现多行转一行

  • 使用 group by + collect_set/collect_list

    group by 用于分组,分组后可以使用 collect_set/collect_list 对每组数据进行聚合,最终会得到 array 类型的数据,可以使用 concat_ws 转成字符串。

    • collect_set 会进行去重处理,collect_list 不会。
select clazz,collect_set(age) as age_set,collect_list(age) as age_list
from students
group by clazz;

Hive 中有哪些常用的字符串函数

  • concat('123','456'): 结果是 123456
  • concat('123','456',null): 结果是 NULL
select concat_ws('#','a','b','c');  -- a#b#c
select concat_ws('#','a','b','c',NULL);  -- a#b#c,可以指定分隔符,并且会自动忽略NULL
select concat_ws("|",cast(id as string),name,cast(age as string),gender,clazz) from students limit 10;select substring("abcdefg",1);  -- abcdefg,HQL中涉及到位置的时候是从1开始计数-- '2021/01/14' -> '2021-01-14'
select concat_ws("-",substring('2021/01/14',1,4),substring('2021/01/14',6,2),substring('2021/01/14',9,2));
-- 建议使用日期函数去做日期
select from_unixtime(unix_timestamp('2021/01/14','yyyy/MM/dd'),'yyyy-MM-dd');select split("abcde,fgh",",");  -- ["abcde","fgh"]
select split("a,b,c,d,e,f",",")[2];  -- cselect explode(split("abcde,fgh",","));  -- abcde  -- fgh
  • 解析 JSON 格式的数据:
select get_json_object('{"name":"zhangsan","age":18,"score":[{"course_name":"math","score":100},{"course_name":"english","score":60}]}',"$.score[0].score");  -- 100

20240920

常用的三种排名类窗口函数及区别

  • rank(): 1224
  • row_number(): 1234
  • dense_rank(): 1223

窗口函数怎么使用

在窗口函数后面接上 over(partition by 分组字段 order by 排序字段 desc) 作为别名 rn

Hive 中有哪些常用的窗口函数

  • 排名类

    • rank(): 1224
    • row_number(): 1234
    • dense_rank(): 1223
    • percent_rank: (rank的结果 - 1) / (分区内数据的个数 - 1)
    • cume_dist: 计算某个窗口或分区中某个值的累积分布。
      • 假定升序排序,使用以下公式确定累积分布:
        • 小于等于当前值 x 的行数 / 窗口或 partition 分区内的总行数。
        • 其中,x 等于 order by 子句中指定的列的当前行中的值。
    • ntile(n): 对分区内数据再分成 n 组,然后打上组号。
  • 取值类

    • LAG(col, n): 往前第 n 行数据
    • LEAD(col, n): 往后第 n 行数据
    • FIRST_VALUE: 取分组内排序后,第一个值
    • LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值,对于并列的排名,取最后一个。
  • 聚合类

    • max, min, avg, count, sum

Hive 中有哪些 NULL 值的判断方式

  • IF or CASE 函数:根据条件返回不同的值。
IF(column_name IS NULL, 'default_value', column_name)
CASE WHEN column_name IS NULL THEN 'default_value'           ELSE column_name        
END AS result
  • COALESCE 函数:返回第一个非 NULL 值。
COALESCE(column_name, 'default_value')
  • NVL 函数:将 NULL 值替换为指定的值(Hive 2.1.0 及以上版本)。
NVL(column_name, 'default_value')

Hive 中时间字符串和时间戳之间如何转换?

select from_unixtime(1610611142, 'YYYY/MM/dd HH:mm:ss');
select from_unixtime(unix_timestamp(), 'YYYY/MM/dd HH:mm:ss');
  • from_unixtime 将时间戳转换为日期格式字符串。
  • unix_timestamp 将不是特定格式的时间转为时间戳。
select from_unixtime(unix_timestamp('2021年01月14日','yyyy年MM月dd日'),'yyyy-MM-dd');

连续登录问题

先求出每个用户每天的消费总额,再按时间去开窗排名,将日期去减这个排名数可以达到分组的效果,再分组求和求次数,得到一段连续时间的消费总额和连续登录消费次数,用 minmax 求每个连续时间段的开始时间和结束时间,用每个开始时间去减上一个的结束时间得到每个连续时间段中的间隔时间,或者直接用分组之间的日期差,因为只有连续时间段的才会在一个组里,组之间的差值结束间隔时间。

order bySUM 窗口函数的影响

如果 sum 窗口函数中的字段被排序了,总和一列就会有一个累加的过程,没指定排序就是一列总和和外部 order by 一样。

窗口帧是什么?

窗口帧用于从分区中选择指定的多条记录,供窗口函数处理。Hive 提供了两种定义窗口帧的形式:ROWSRANGE。两种类型都需要配置上界和下界。

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: 表示选择分区起始记录到当前记录的所有行;
  • SUM(close) RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING: 则通过字段差值来进行选择。
  • 如当前行的 close 字段值是 200,那么这个窗口帧的定义就会选择分区中 close 字段值落在 100400 区间的记录。以下是所有可能的窗口帧定义组合。如果没有定义窗口帧,则默认为 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

只能运用在max、min、avg、count、sum、FIRST_VALUE、LAST_VALUE这几个窗口函数上。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql数据库一

CREATE DATABASE 数据库名;//创建数据库 SHOW databases;//查看数据库列表 USE 数据库名;//选择数据库 DROP DATABASE 数据库名://删除数据库

做好网站后如何让这个网站被更多的人浏览查看?

许多人都有这样一个问题:做好自己的网站,如何让这个网站被更多的人浏览看,查看到呢?有人可能会说简单粗暴的方式:买百度排名,买广告排名。没错,这是一直最直接的方式,但问题是这里的成本还是比较多的,对于之前没有做过SEM的个人和企业来说,在哪里买,买多少合适,买多…

http server

我下载了 https://archive.apache.org/dist/httpd/httpd-2.4.62.tar.gz 请问如何解压配置一个apache server,并配置新增端口30000,转发到nginx 32020端口 ⚠️由于网站限制,Kimi 未能阅读这个网页中的要解压、配置Apache服务器,并设置端口转发到Nginx,你可以按照以下步骤操作…

重链剖分学习笔记

一、引入 学习一个新的数据结构或者算法前,我们都要了解其用途,毕竟用途才是其被发明出来的原因。那么树链剖分有什么用呢?它维护的是什么样的信息呢?这里我们只探讨重链剖分。树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。 具体来说,将整棵树剖分为若干…

grafana对redis哨兵模式监控添加主库信息

【环境说明】 redis+sentinel哨兵模式+prometheus+grafana监控面板 【要求】 redis哨兵模式,需要查看主库节点信息,如果发生切换,能查到历史变化信息 【配置操作】 当前已经安装好三个redis数据库跟哨兵模式,并且都安装好了redis-exporter监控服务 prometheus配置监控信息:…

20222327 2024-2025-1 《网络与系统攻防技术》实验四实验报告

一、实验内容 1.恶意代码文件类型标识、脱壳与字符串提取 2.使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。 3.分析一个自制恶意代码样本rada,并撰写报告,回答问题 4.取证分析实践 二、实验过程 1.对恶意代码样本,进行文件类型…

20222327 2024-2025-1 《网络与系统攻防技术》实验四报告

一、实验内容 1.恶意代码文件类型标识、脱壳与字符串提取 2.使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。 3.分析一个自制恶意代码样本rada,并撰写报告,回答问题 4.取证分析实践 二、实验过程 1.对恶意代码样本,进行文件类型…

在Windows上同时运行多个java程序如何区分

显示命令行后通过 jar文件路径区别也可以通过内存大小来判定是哪个程序在服务中也能找到 PID用*.bat来启动 UdpListener8102 效果,会在应用中显示用服务启动则在 后台进程中显示

《地下城与勇士:同人单机版》游戏 —— 经典重现,单人冒险新体验

引言 《地下城与勇士》作为一款经典的多人在线角色扮演游戏(MMORPG),在全球范围内拥有庞大的粉丝群体。对于许多热爱这款游戏的玩家来说,能够体验到一个单人版的《地下城与勇士》无疑是一个令人兴奋的提议。现在,让我们来探索这个由粉丝打造的《地下城与勇士:同人单机版》…

_html

html 一、基本介绍 1、定义:html是一种超文本标记语言,也是一种标识性语言(不是编程语言) 标记:记号(绰号) 超文本:就是页面内容可以包含图片、链接,音乐,视频等素材。 2、为什么学习html? (1)测试页面元素,了解页面页面元素(页面是html语言编写的) (2)进行u…

【semantic Kernel】文转图

SK也对应了文生图的功能,本文中分别使用的是GPT的DALLE 2和DALLE 3来生成图版,虽然不如专业的文生图那么专业,但提示词到位,在一些场景中还是可用的。 下面是最简单的文生图的代码实现,通过TextToImage服务来完成生成,GPT中生成图的尺寸要求是:256x256, 512x512, 1024x1…