Hive的基本操作(查询)

news2024/12/24 18:45:21

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;

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

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

相关文章

超市管理系统 需求分析与设计 UML 方向

一、项目介绍 1.1项目背景 随着经济一体化和电子商务的迅速发展&#xff0c;网络传播信息的速度打破了传统信息传递的模式&#xff0c;互联网的高速发展和计算机应用在各个高校进展迅速&#xff0c;更多信息化产品的突飞猛进&#xff0c;让现代的管理模式也发生了巨大的变化&…

Catena-x标准解读:CX-0005 Item Relationship Service API 2.1.1 项目关系服务

1 介绍 如今&#xff0c;大量数据存储在一个行业供应链的不同参与者之间。通过将数据与其相关上下文连接起来&#xff0c;可以极大地提高数据的价值。 为了实现跨企业链接数据&#xff0c;应用了方面模型、标准化协议和连接数据的标准化方法等标准。Catena-X为访问跨企业链接…

Python学习:实现Python项目并学习如何进行(附70个项目源码)

实现Python项目并学习如何进行&#xff0c;是一个循序渐进的过程&#xff0c;涵盖了多个方面&#xff0c;包括基础知识的学习、技能的提升、项目的规划和实施等。以下是一个基本的指南&#xff0c;帮助你开始学习并实现Python项目&#xff1a; 1. 学习Python基础知识 语法与基…

Linux介绍以及常用命令

目录 1. 什么是Linux 2. Linux的种类 3. CentOS7 超详细的CentOS7.4下载与图文安装 4. 常用的网络适配器种类 5. 安装ssh客户端软件 6. CentOS7的目录结构 7. Linux常用命令详解 1.目录切换命令 -- cd 2. 查看目录下的内容 -- ls 3. 查看当前所在的目录 -- pwd 4. 创…

如何在gitee上创建远程仓库?

登录gitee网站后 填写自己的仓库信息后点击创建 然后来到一个新的界面可以看到自己的仓库地址 这样一个空白的仓库就建立好了 也可以按需选择初始化仓库

结合类型信息(1)——特征丰富的知识库补全网络

1 引言 1.1 问题 首先&#xff0c;隐式对应关系的问题。在联合嵌入模型中&#xff0c;知识库和文本数据之间的关系并不是直接给出的&#xff0c;而是需要通过实体在文本中的共现来推断。这意味着模型必须从上下文中学习实体之间的潜在关联&#xff0c;而不是基于显式的标签或…

利用css设计一套漩涡式网格(grid)布局

在Web开发中,CSS Grid布局系统为我们提供了前所未有的灵活性和控制力,使得创建复杂的二维布局变得轻而易举。今天,我们将探讨一种特殊的Grid布局——漩涡式布局,并通过一个具体的HTML和CSS示例来深入了解其实现方式。 漩涡式Grid布局概述 漩涡式Grid布局是一种视觉上呈现出…

【Linux】Ubuntu 漏洞扫描与修复的吃瘪经历

自从上次“劫持”事情后&#xff0c;项目经理将所有跟安全相关的都推给我了&#xff08;不算 KPI 又要被白嫖&#xff0c;烦死了&#xff09;。这次客户又提了一个服务器安全扫描和漏洞修复的“活”&#xff0c;我这边顺手将过程记录一下&#xff0c;就当经验总结跟各位分享一下…

一群追星星的人,对 AI 的盼与怕

面对 AI&#xff0c;有人害怕&#xff0c;有人期盼。 “AI 和画画的、开网约车的、写东西的人有仇吗&#xff1f;”近来成了很多从业者的心声。大模型技术驱动了 AI 的能力进化过临界点&#xff0c;我们普通人根本就跟不上&#xff0c;或快或慢被淘汰。看起来&#xff0c;AI 正…

[ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;VRISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。 VRISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…

SpringBoot中动态注册Bean的方式

测试环境&#xff0c;本文源码 Java&#xff1a;8SpringBoot&#xff1a;2.5.14示例场景&#xff1a;动态注册ProxyServlet&#xff0c;间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中&#xff0c;先进行 Bean 的定义&#xff0c;…

【前端4】表单 编辑模式、只读模式:HTML的`readonly`、el-input的v-if=“isEdit“

【前端】表单 编辑模式、只读模式 写在最前面一、什么是编辑模式与只读模式&#xff1f;应用场景编辑模式只读模式 二、编辑模式的实现例子只读模式的实现动态切换模式使用HTML的readonly属性使用Vue.js的v-if指令 三、前后端交互 <template>代码块两个字段独立是否直接与…

Auto CAD 2020下载安装教程怎么安装如何使用

Auto CAD 2020下载安装教程 下载链接&#xff1a;https://pan.baidu.com/s/16WR6WdkWqn8WnShZHu8S5Q?pwdhdh7 提取码&#xff1a;hdh7 解压后看到这些文件 进入第一个文件夹后看到安装包&#xff0c;如果缺少了第二个文件&#xff0c;先关闭杀毒软件后重新解压即可 进入…

超全整理,数据管理CDMP认证介绍

CDMP认证概述 CDMP&#xff08;Certified Data Management Professional&#xff09;认证&#xff0c;全称数据管理专业人士认证&#xff0c;是由国际数据管理协会&#xff08;DAMA International&#xff09;推出的权威认证。该认证旨在全面评估个人在数据管理和治理领域的专…

PyMongo Sort 操作:提升你的数据查询效率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

最新PHP自助商城源码,彩虹商城源码

演示效果图 后台效果图 运行环境&#xff1a; Nginx 1.22.1 Mysql5.7 PHP7.4 直接访问域名即可安装 彩虹自助下单系统二次开发 拥有供货商系统 多余模板删除 保留一套商城,两套发卡 源码无后门隐患 已知存在的BUG修复 彩虹商城源码&#xff1a;下载 密码:chsc 免责声明&…

[MySQL][表的增删查改][二][Retrieve][SELECT][WHERE]详细讲解

目录 1.Retrieve1.基本语法2.SELECT列1.全列查询2.查询字段为表达式3.为查询结果指定别名4.结果去重 3.WHERE条件1.比较运算符2.逻辑运算符3.示例 4.结果排序1.基本语法2.示例 5.筛选分页结果 1.Retrieve 1.基本语法 SELECT [DISTINCT] * | {column [, column] ...} [FROM ta…

一个快速可视化Psrfits(search mode)的工具

【ONE】快速可视化Psrfits&#xff08;search mode&#xff09;的工具 此工具可以快速检测和处理数据中的问题或异常&#xff0c;在不损失采样率的情况下帮助查看脉冲的动态谱、脉冲结构。 网址:https://github.com/PersusX/PDDT 基于 pyqtgraph 的交互式查看数据的工具。 P…

Java SE—基本数据类型(详细讲解)

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约 ⏩收录专栏⏪&#xff1a;Java SE &#x1f921;往期回顾&#x1f921;&#xff1a;Python 神器&#xff1a;wxauto 库——解锁微信自动化的无限可能 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f3…

效能工具:执行 npm start 可直接切换proxy代理UR后直接启动项目

1) 背景: 我们项目是2个前端3个后端的配置。前端和每个后端都有需要调试的接口。 因此经常切换vite.congig.js中的proxy后端代理链接&#xff0c;是挺麻烦的。 于是我研究如何能快速切换后端URL&#xff0c;所幸懒人有懒福&#xff0c;我找到了Inquirer 和 fs&#xff0c; 实…