Hive的基本操作(查询)

1、基础查询

基本语法

select 字段列表|表达式|子查询
from(子查询|视图|临时表|普通表)
where [not] 条件A and|or 条件B				--先:面向原始行进行筛选
group by 字段A[,字段B,...]					=> 分组【去重处理】
having 聚合条件(非原始字段条件)				--再:针对聚合后的字段进行二次筛选
order|sort|cluster by 字段A[,字段B,...]		--后:全局排序(非limit的最后一句)	走mapreduce
limit N(前N条记录) | M(行号偏移量),N(记录数)

1.where子句的条件格式

一:关系运算符
关系运算符:> , >= , < , <= , =【等值判断】 , <>【不等于】
  • 延伸:between (>=)SMALL_VALUE and (<=)BIG_VALUE; 【面向于 数值或日期】
二:逻辑运算符
逻辑运算符:not【非】 , and【与】 , or【或】
  • 延伸
--if函数:
if(BOOLEN_EXPR,VALUE_IF_TRUE,VALUE_IF_FALSE_OR_NULL)
	案例:
        select user_id,`if`(order_amount < 1000,'low','high') as consumption
        from test1w
        where user_gender = '女'
        limit 100;
	结果展示:
		user_id	consumption
		652,high
        376,high
        537,high
        280,high
        23,high
  
--空值判断:
1.nvl(VALUE_A,VALUE_B)	=>	VALUE_A为空值(null),则返回VALUE_B。否则返回VALUE_A
2.isnull(VAL)		=>	如果 VAL 为 null,则返回 1 。否则返回 0

--case when函数:
case EXPR when V1 then VAL1 when V2 then VAL2 ... else VALN end <=> switch ... case
case when 条件1 then VAL1 when 条件2 then VAL2 ... else VALN end <=> if ... else if ...
	案例:
		select user_id,
			case when order_amount<1000 then '低消费人群' 
				when order_amount<5000 then '中等消费人群' 
				else '高消费人群' end as level
        from test1w
        where user_gender = '女'
        limit 100;
	结果展示:
		user_id	level
		652,高消费人群
        376,高消费人群
        537,低消费人群
        280,中等消费人群
		...
三:通配符

模糊查询

基本语法:
	like '% | _'	【模糊匹配】
	
讲解:
	% => 任意个任意符号
	_ => 一个任意符号

案例:
	select "张无极" like '张%';		=> true
	select "张无极" like '张_';		=> false

正则匹配

基本语法:
	rlike '正则表达式'
	如:'^//d+$'

案例:
	select "like" rlike '^[a-zA-Z]{2,4}$';	  =>true

2.排序

1order by 表达式[field|func|case...when...]    		---【全局排序】:性能差
	优化:在order by B 之前,可以先对数据进行 distribute by A 与 sort by B
		=> 先部分排序,后全局排序
		
2、sort by FIELD_N 								  --在【每一个reducer端】排序
	解释:
		当reducer 的数量为1时,等同于 order by
		FIELD_N 必须是select字段列表中的一员
		一般和 distribute by 配合使用
	
3、cluster by 		--cluster by 字段A = distribute by 字段A + sort by 字段A

3.分组

1group by 表达式(field|func|case...when) 	--为了聚合而分组,否则类似去重(代替distinct)
	目的:按照某些条件对数据进行分组并进行聚合操作,使用 group by
	多分组:
		1.group by A,B,C 		
		  grouping sets(B,(A,C),(B,C))--指定多个【分组】为:B,(A,C),(B,C)
		  
		2.group by cube(A,B,C) 		--排列组合后的所有分组:A,B,C,(A,B),(A,C),(B,C),(A,B,C)
		
		3.group by rollup(A,B,C)	--最左原则的所有分组:A,(A,B),(A,B,C)
		
2、distribute by 表达式(field|func|case...when)
	目的:为了将数据分区,仅仅将数据分发到多个节点上并行处理,使用 distribute by
	解释:
		1.不改变原始行数
		2.类似于 hadoop job 中的 Partitioner。 【默认是采用hash算法】
		3.指定按哪个字段的hashcode分区,配合【预先设置reducer数量】
	注意:
		distribute by【决定进哪个reducer】与sort by【在reducer中排序】一般搭配使用的
		distribute by通常使用在SORT BY语句之前

小型案例

with product_total as ( 
    select order_item_product_id product_id,sum(order_item_subtotal) total
    from cb_order_items
    group by order_item_product_id
)
select product_id,total
from product_total
distribute by product_id
sort by total desc;
多分组案例
1.grouping sets 案例:✔
	create temporary table tmp_cb_order_ymbsc_sets as
	select year,month,dept_id,cate_id,prod_id
		grouping__id,
		sum(quantity) as quantity,
		round(sum(amount)) as amount
	from tmp_cb_order_ymbsc
	group by year,month,dept_id,cate_id,prod_id
	grouping sets(prod_id,(dept_id,cate_id),(year,month),(year,month,prod_id))
	order by grouping__id;
	-------------------------------------
	寻找哪几组【去重】:
		select grouping__id
		from tmp_cb_order_ymbsc_sets
		group by grouping__id;
	-------------------------------------
	-- grouping__id:
	6 :	year,month,prod_id
	7 :	year,month
	25 : dept_id,cate_id 	
	30 : prod_id
	
	
2.cube 案例:【不常用】
	select
		year(order_date) as year,
		month(order_date) as month,
		day(order_date) as day,
		count(*) as count,
		grouping__id
	from cb_orders
	group by cube (year(order_date),month(order_date),day(order_date))
	order by grouping__id;
	
	
	
3.rollup 案例:【不常用】
	select
		year(order_date) as year,
		month(order_date) as month,
		day(order_date) as day,
		count(*) as count,
		grouping__id
	from cb_orders
	group by rollup (year(order_date),month(order_date),day(order_date))
	order by grouping__id;

2、子查询

基本语法

select 			可以出现子查询(查某个字段值,与主查询存在逻辑主外键关系)
from 			可以出现子查询(数据表的子集 select F1,...,FN from T where ... group by ...)
where 			可以出现子查询(FIELD in|=|>= (select ONLY_ONE_FIELD_IN ...))
group by FIELD|substr(FIELD,0,4),...
having 			可以出现子查询(FIELD in|=|>= (select ONLY_ONE_FIELD_IN ...))
order by FIELD|substr(FIELD,0,4),...

常用语法【from子查询】

select 字段列表|表达式|子查询
from(
    select 字段列表|表达式|子查询					 ---先进行内部的查询
    from TABLE
    where [not] 条件A and|or 条件B
    ...
)												---后进行外部的查询
where [not] 条件A and|or 条件B						--后=>先:面向原始行进行筛选
group by 字段A[,字段B,...]	
order by 字段A[,字段B,...]							--后=>再:针对聚合后的字段进行二次筛选
limit N(前N条记录) | M(行号偏移量),N(记录数)		--后=>后:全局排序(非limit的最后一句)

3、CTE

基本语法

with 
SUB_ALIA as(...),
SUB_ALTER as(select...from SUB_ALIA...)
select...

小型案例

with
    total_amount as(
        select sum(order_amount) total
        from hive_internal_par_regex_test1w
        where year>=2016
        group by user_gender, user_id
        having total>=20000
    ),
    level_amount as(
        select round(total/10000) as level
        from total_amount
    )
select level,count(*) as level_count
from level_amount
group by level;

结果展示:
	level level_count
	2,162
    3,125
    4,26
    5,5

4、联合查询

数据准备

Class表:
+-------+---------+
|classId|className|
+-------+---------+
|      1|  yb12211|
|      2|  yb12309|
|      3|  yb12401|
+-------+---------+

Student表:
+-----+-------+
| name|classId|
+-----+-------+
|henry|      1|
|ariel|      2|
| jack|      1|
| rose|      4|
|jerry|      2|
| mary|      1|
+-----+-------+

三种主要形式

一:内连接【inner join】

两集合取交集

select A.内容,....,B.内容,...                              =>字段别名:提高筛选的性能
from TABLE_A as A												
inner join TABLE_B as B
on A.主键=B.外键 (and A.fa = VALUE...)  多表√ 两表√        	=>表进行合并时进行【连接条件】
where A.fa = VALUE;                     两表√             =>合并后进行【条件筛选】
group by ...
having ...
order by ...
limit ...

小型案例

select * from Student S
inner join Class C
on S.classId = C.classId

结果展示:
    +-----+-------+-------+---------+
    | name|classId|classId|className|
    +-----+-------+-------+---------+
    |henry|      1|      1|  yb12211|
    |ariel|      2|      2|  yb12309|
    | jack|      1|      1|  yb12211|
    |jerry|      2|      2|  yb12309|
    | mary|      1|      1|  yb12211|
    +-----+-------+-------+---------+
二:外连接
左外连接【left join】

两个集合取左全集,右交集

select A.内容,....,B.内容,...                              	     =>字段别名:提高筛选的性能
from TABLE_A as A                 									【A为主表】
left [outer] join TABLE_B as B		    							【B为从表】
on A.主键|外键=B.外键|主键 (and A.fa = VALUE...)    多表√ 两表√     =>表进行合并时进行【连接条件】
where A.fa = VALUE;                                 两表√        =>合并后进行【条件筛选】
group by ...
having ...
order by ...
limit ...

小型案例

select * from Student S
left join Class C
on S.classId = C.classId

结果展示:
    +-----+-------+-------+---------+
    | name|classId|classId|className|
    +-----+-------+-------+---------+
    |henry|      1|      1|  yb12211|
    |ariel|      2|      2|  yb12309|
    | jack|      1|      1|  yb12211|
    | rose|      4|   null|     null|
    |jerry|      2|      2|  yb12309|
    | mary|      1|      1|  yb12211|
    +-----+-------+-------+---------+
右外连接【right join】

两集合取右全集,左交集

select A.内容,....,B.内容,...                              		=>字段别名:提高筛选的性能
from TABLE_A as A                 										【A为主表】
right [outer] join TABLE_B as B		    								【B为从表】
on A.主键|外键=B.外键|主键 (and A.fa = VALUE;)    多表√ 两表√      =>表进行合并时进行【连接条件】
where A.fa = VALUE;                               两表√         =>合并后进行【条件筛选】
group by ...
having ...
order by ...
limit ...

小型案例

select * from Student S
right join Class C
on S.classId = C.classId

结果展示:
    +-----+-------+-------+---------+
    | name|classId|classId|className|
    +-----+-------+-------+---------+
    | mary|      1|      1|  yb12211|
    | jack|      1|      1|  yb12211|
    |henry|      1|      1|  yb12211|
    |jerry|      2|      2|  yb12309|
    |ariel|      2|      2|  yb12309|
    | null|   null|      3|  yb12401|
    +-----+-------+-------+---------+
全外连接【full join】

两集合取左右全集

select A.内容,....,B.内容,...                              		 =>字段别名:提高筛选的性能
from TABLE_A as A                 										【A为主表】
full [outer] join TABLE_B as B		    								【B为从表】
on A.主键|外键=B.外键|主键 (and A.fa = VALUE;)    多表√ 两表√       =>表进行合并时进行【连接条件】
where A.fa = VALUE;                               两表√          =>合并后进行【条件筛选】
group by ...
having ...
order by ...
limit ...

小型案例

select * from Student S
full join Class C
on S.classId = C.classId

结果展示:
    +-----+-------+-------+---------+
    | name|classId|classId|className|
    +-----+-------+-------+---------+
    |henry|      1|      1|  yb12211|
    | jack|      1|      1|  yb12211|
    | mary|      1|      1|  yb12211|
    | null|   null|      3|  yb12401|
    | rose|      4|   null|     null|
    |ariel|      2|      2|  yb12309|
    |jerry|      2|      2|  yb12309|
    +-----+-------+-------+---------+
三:交叉连接【cross join】

两集合取笛卡尔积

select A.内容,....,B.内容,...                              		 =>字段别名:提高筛选的性能
from TABLE_A as A                 										【A为主表】
cross join TABLE_B as B		    										【B为从表】
on A.主键|外键=B.外键|主键 (and A.fa = VALUE;)    多表√ 两表√       =>表进行合并时进行【连接条件】
where A.fa = VALUE;                               两表√          =>合并后进行【条件筛选】
group by ...
having ...
order by ...
limit ...

小型案例

select * from Student S
cross join Class C
on S.classId = C.classId

结果展示:
    +-----+-------+-------+---------+
    | name|classId|classId|className|
    +-----+-------+-------+---------+
    |henry|      1|      1|  yb12211|
    |henry|      1|      2|  yb12309|
    |henry|      1|      3|  yb12401|
    |ariel|      2|      1|  yb12211|
    |ariel|      2|      2|  yb12309|
    |ariel|      2|      3|  yb12401|
    | jack|      1|      1|  yb12211|
    | jack|      1|      2|  yb12309|
    | jack|      1|      3|  yb12401|
    | rose|      4|      1|  yb12211|
    | rose|      4|      2|  yb12309|
    | rose|      4|      3|  yb12401|
    |jerry|      2|      1|  yb12211|
    |jerry|      2|      2|  yb12309|
    |jerry|      2|      3|  yb12401|
    | mary|      1|      1|  yb12211|
    | mary|      1|      2|  yb12309|
    | mary|      1|      3|  yb12401|
    +-----+-------+-------+---------+

5、联合查询

何为联合查询?

  • 纵向拼接表,高变大

  • 查询字段的【数量】与【类型】必须相同,字段名是以【第一张表为准】。

union与union all的区分

  • union:合并后删除重复项(去重)

  • union all:合并后保留重复项 ✔

小型案例

数据准备

语句

select age,job from bank_client_info_3
union all
select age,job from bank_client_info_3;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》12.3 DMIN函数

第12章&#xff1a;数据库函数 第三节 12.3 DMIN函数 12.3.1 简介 DMIN函数是Excel中的一个数据库函数&#xff0c;用于返回数据库或数据表中特定条件下某字段的最小值。DMIN函数在处理大规模数据、数据筛选和分析时非常有用。 12.3.2 语法 DMIN(database, field, criteri…

MYSQL 四、mysql进阶 9(数据库的设计规范)

一、为什么需要数据库设计 二、范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的…

LLM量化--AWQ论文阅读笔记

写在前面&#xff1a;近来大模型十分火爆&#xff0c;所以最近开启了一波对大模型推理优化论文的阅读&#xff0c;下面是自己的阅读笔记&#xff0c;里面对文章的理解并不全面&#xff0c;只将自己认为比较重要的部分摘了出来&#xff0c;详读的大家可以参看原文 原论文地址&am…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

axios以post方式提交表单形式数据

某些后端框架请求接口必须走form表单提交的那种形式&#xff0c;但前端很少有<form action"接口地址" method"post"></form>这种写法去提交表单数据&#xff0c;所以前端需要用axios模拟一个表单提交接口。 Content-Type 代表发送端&#xff0…

【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页

文章目录 前言一、在ASP.NET中应用CSS样式1、创建CSS样式&#xff08;1&#xff09;内联样式&#xff08;2&#xff09;内部样式表&#xff08;3&#xff09;外部样式表 2、应用CSS样式&#xff08;1&#xff09;菜鸟教程-简单例子&#xff08;2&#xff09;菜鸟教程-用户界面&…

零售门店收银系统源码

php收银系统源码-CSDN博客文章浏览阅读268次&#xff0c;点赞6次&#xff0c;收藏4次。收银系统源码https://blog.csdn.net/qh716/article/details/140431477 1.系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网站: HTML5vue2.0element-uicssjs线下收…

【区块链 + 智慧政务】涉税行政事业性收费“e 链通”项目 | FISCO BCOS应用案例

国内很多城市目前划转至税务部门征收的非税收入项目已达 17 项&#xff0c;其征管方式为行政主管部门核定后交由税务 部门征收。涉税行政事业性收费受限于传统的管理模式&#xff0c;缴费人、业务主管部门、税务部门、财政部门四方处于 相对孤立的状态&#xff0c;信息的传递靠…

校园网自动登录脚本【Windows 10】

如果要使用校园网&#xff0c;必须打开浏览器输入校园网地址&#xff0c;之后输入账号密码登录。实验室电脑绝大多数情况下应该处于联网状态&#xff0c;但不幸的是&#xff0c;我深会限制校园网客户端数量&#xff0c;一旦有新设备接入&#xff0c;很可能实验室电脑就会断网。…

实现给Nginx的指定网站开启basic认证——http基本认证

一、问题描述 目前我们配置的网站内容都是没有限制&#xff0c;可以让任何人打开浏览器都能够访问&#xff0c;这样就会存在一个问题&#xff08;可能会存在一些恶意访问的用户进行恶意操作&#xff0c;直接访问到我们的敏感后台路径进行操作&#xff0c;风险就会很大&#xff…

wps批量删除空白单元格

目录 原始数据1.按ctrlg键2.选择“空值”&#xff0c;点击“定位”3. 右击&#xff0c;删除单元格修改后的数据 原始数据 1.按ctrlg键 2.选择“空值”&#xff0c;点击“定位” 如图所示&#xff0c;空值已被选中 3. 右击&#xff0c;删除单元格 修改后的数据

数据结构—链式二叉树-C语言

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 在现实中搜索二叉树为常用的二叉树之一&#xff0c;今天我们就要通过链表来实现搜索二叉树。实现的操作有&#xff1a;建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…

AI音乐创作:一键生成,打造你的专属乐章

文章目录 &#x1f34a;AI音乐创作&#xff1a;一键生成&#xff0c;打造你的专属乐章1 市面上的AI音乐应用1.1 Suno AI1.2 网易天音 2 AI音乐创作的流程2.1 AI音乐风格/流派2.2 AI音乐的结构顺序2.3 使用KIMI生成AI音乐歌词2.4 选择AI音乐乐器2.5 书写AI音乐提示词2.5.1 方法一…

Java NIO 比传统 IO 强在哪里?

这里先给大家展示一副传统 IO 和 NIO 的对比图&#xff0c;感受一下。 传统IO基于字节流或字符流&#xff08;如 FileInputStream、BufferedReader 等&#xff09;进行文件读写&#xff0c;以及使用Socket和ServerSocketChannel进行网络传输。 NIO 使通道&#xff08;Channel&a…

【过题笔记】 7.15

Array Without Local Maximums 算法&#xff1a;动态规划 简要思路&#xff1a; 考虑左边的数跟当前位置的关系&#xff0c;不难想到只有三种情况&#xff1a;大于&#xff0c;小于&#xff0c;等于。 于是可以得到状态 f [ i ] [ j ] [ 0 / 1 / 2 ] f[i][j][0/1/2] f[i][j][…

ubuntu22.04安装SecureCRT8.7.3,完成顺利使用

材料准备 scrt-sfx安装包 &#xff0c; securecrt_linux_crack.pl 补丁脚本&#xff0c;和两个依赖库 其中securecrt_linux_crack.pl是找的专门适合 8.7.3版本的&#xff0c;网上很多版本的crack.pl只能打补丁以前的老版本。 而更老版本的SecureCRT对ubuntu22支持更不好&#…

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…

HTML5+CSS3小实例:纯CSS实现奥运五环

实例:纯CSS实现奥运五环 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sca…

1.CATIA:CAA调用Excel接口

生成调用Excel的头文件 参考如下进行excel头文件的生成: 如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件 添加如下的接口: #include "CApplication.h" #include "CWorkbook.h" #include "CWorkbooks.h" #include "CWorkshee…

AMD software 将两个显示器合并为一个超宽显示器

最近玩游戏的时候&#xff0c;发现了一个骚操作。 可以将两个显示器&#xff08;更多个的自己去试&#xff0c;不知道&#xff09;组合为一个显示器&#xff0c;注意&#xff0c;这里说的不是将两个显示都连接电脑从而使用双屏显示器&#xff0c; 而是 将两个显示器组合为一个…