首页 > 其他分享 >hive基础知识分享(二)

hive基础知识分享(二)

时间:2024-11-07 18:46:24浏览次数:3  
标签:窗口 name -- Hive 基础知识 分组 hive 分享 select

写在前面

今天继续学习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];  -- c

select 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这几个窗口函数上。

标签:窗口,name,--,Hive,基础知识,分组,hive,分享,select
From: https://www.cnblogs.com/cjybigdatablog/p/18530575

相关文章

  • Materials Studio 2023安装教程(仅作分享参考)
    一、软件下载软件名称:MaterialsStudio2023软件语言:英文软件大小:2.03G系统要求:Windows10或更高, 64位操作系统硬件要求:CPU@2+GHz,RAM@4G或更高下载通道①迅雷云盘丨下载链接:迅雷云盘下载通道②百度网盘丨下载链接:百度网盘请输入提取码提取码:6789二、软件介绍Material......
  • 分享一个替代ping的小工具Hping3
    在网络故障排查中,ping命令是最基础也是最常用的工具,然而,它的功能相对简单,局限性明显。对于复杂的网络环境,使用更强大的工具显得尤为重要。在这方面,Hping3无疑是一个出色的选择。本文将详细介绍Hping3的功能、应用场景以及与Ping的对比,帮助网络工程师更有效地排查网络问题。Hping......
  • 【Hive SQL】如何判断一个字段是否包含某个特定的值
    在HiveSQL中,如果你需要判断一个字段是否包含某个特定的值,你可以使用 LIKE 或RLIKE 关键字来进行字符串匹配。此外,Hive也支持一些字符串函数,如 INSTR 和LOCATE,这些都可以用于不同的需求场景。以下是一些常见的方法来判断一个字段是否包含某个值:数据准备——创建表格......
  • 【测开面试篇一】全网最全测试开发岗位面试真题集分享
    前言        各位测试人,大家好,最近不是在网上投简历,就是在面试的路上。也接到了不少电话面试以及F2F面试,花时间给大家整理一下互联网大厂测试开发岗位的面试知识点和一些遇到的真题,各位看官请笑纳。        本人整理的面试知识点以及面试真题涵盖了互联网大......
  • 软件工程基础知识
    三要素:方法、工具、过程研究内容:开发技术(开发方法学、开发过程模型、开发工具和环境);工程管理(软件管理学、软件工程经济学、软件心理学)过程:PDCAplan:软件规格说明,规定软件的功能及其使用的限制do:软件开发,产生满足规格说明的软件check:软件确认,通过有效性验证保证软件满足客户......
  • RabbitMQ基础知识
    消息队列,原则FIFO,队列中存档的内容是message用途:订阅发布,不同进程/线程之间通信消息队列的产生:1.不同进程传递消息,两个进程耦合程度过高,影响另一个进程,为了隔离两个进程,抽出一个一层,所有两个进程之间传递的消息,都必须通过消息队列来传递,单独修改某个进行,不会影响另一个;2.某个......
  • 使用C++和QT开发应用程序入门以及开发实例分享
    目录1、搭建开发环境(VS2010和QT4.8.2)2、创建一个QT窗口3、在QT窗口中添加子窗口4、QT界面布局5、QT信号(SIGNAL)和槽(SLOT)6、最后C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实......
  • SpringBoot图片创作分享平台的设计与实现7l7cf 文末可获取,系统界面在最后面。
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,图片橱窗开题报告内容一、选题理由随着互联网技术的飞速发展和社交媒体的普及,图片已成为人们日常交流和分享的重要载体。然而,当前市场上的图片分......
  • 实战分享记录一次某商城0元购和SQL注入漏洞详细操作(学会了你也可以轻松实现!)
    文章目录1前言2商城0元购一、支付漏洞简介二、0元购漏洞零元购漏洞测试修复建议3SQL注入漏洞一、影响参数:二、漏洞POC:三、SQL注入漏洞测试四、修复建议4总结......
  • 用例图基础知识
    什么是用例图用例图描述了一组用例、参与者以及它们之间的关系使用阶段:软件需求分析使用者:软件分析人员、软件开发人员用例模型:把系统看成黑盒子,外部,不考虑功能怎么实现,只考虑有什么功能用例图:用来描述用户的需求,从用户的角度描述系统的功能,并指出各功能的执行者,强调谁在使用......