Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce

一、目标

  1. 掌握hive中select查询语句中的基本语法
  2. 掌握hive中select查询语句的分组
  3. 掌握hive中select查询语句中的join
  4. 掌握hive中select查询语句中的排序

二、要点

1. 基本查询

  • 注意
    • SQL 语言大小写不敏感
    • SQL 可以写在一行或者多行
    • 关键字不能被缩写也不能分行
    • 各子句一般要分行写
    • 使用缩进提高语句的可读性
1.1 全表和特定列查询
  • 全表查询
select * from student;
  • 选择特定列查询
select empno, ename from emp;
1.2 列起别名
  • 重命名一个列

    • 紧跟列名,也可以在列名和别名之间加入关键字 ‘as’
  • 案例实操

     select ename AS name, deptno dn from emp;
    
1.3 常用函数
  • 1.求总行数(count)
 select count(*) cnt from emp;
  • 2、求工资的最大值(max)
select max(sal) max_sal from emp;
  • 3、求工资的最小值(min)
select min(sal) min_sal from emp;
  • 4、求工资的总和(sum)
select sum(sal) sum_sal from emp; 
  • 5、求工资的平均值(avg)
select avg(sal) avg_sal from emp;
1.4 limit 语句
  • 典型的查询会返回多行数据。limit子句用于限制返回的行数。
 select * from emp limit 5;
1.5 where 语句
  • 1、使用 where 子句,将不满足条件的行过滤掉
  • 2、where 子句紧随from子句
  • 3、案例实操
 select * from emp where sal >1000;
1.6 算术运算符
运算符描述
A+BA和B 相加
A-BA减去B
A*BA和B 相乘
A/BA除以B
A%BA对B取余
A&BA和B按位取与
A|BA和B按位取或
A^BA和B按位取异或
~AA按位取反
1.7 比较运算符
操作符支持的数据类型描述
A=B基本数据类型如果A等于B则返回true,反之返回false
A<=>B基本数据类型如果A和B都为NULL,则返回true,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B, A!=B基本数据类型A或者B为NULL则返回NULL;如果A不等于B,则返回true,反之返回false
A<B基本数据类型A或者B为NULL,则返回NULL;如果A小于B,则返回true,反之返回false
A<=B基本数据类型A或者B为NULL,则返回NULL;如果A小于等于B,则返回true,反之返回false
A>B基本数据类型A或者B为NULL,则返回NULL;如果A大于B,则返回true,反之返回false
A>=B基本数据类型A或者B为NULL,则返回NULL;如果A大于等于B,则返回true,反之返回false
A [NOT] BETWEEN B AND C基本数据类型如果A,B或者C任一为NULL,则结果为NULL。如果A的值大于等于B而且小于或等于C,则结果为true,反之为false。如果使用NOT关键字则可达到相反的效果。
A IS NULL所有数据类型如果A等于NULL,则返回true,反之返回false
A IS NOT NULL所有数据类型如果A不等于NULL,则返回true,反之返回false
IN(数值1, 数值2)所有数据类型使用 IN运算显示列表中的值
A [NOT] LIKE BSTRING 类型B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回true;反之返回false。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母’x’结尾,而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用NOT关键字则可达到相反的效果。like不是正则,而是通配符
A RLIKE B, A REGEXP BSTRING 类型B是一个正则表达式,如果A与其匹配,则返回true;反之返回false。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。
1.8 逻辑运算符
操作符操作描述
A AND B逻辑并如果A和B都是true则为true,否则false
A OR B逻辑或如果A或B或两者都是true则为true,否则false
NOT A逻辑否如果A为false则为true,否则false

2. 分组

2.1 Group By 语句

​ Group By 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

  • 案例实操:

    • (1)计算emp表每个部门的平均工资
    select t.deptno, avg(t.sal) as avg_sal from emp t group by t.deptno;
    
    • (2)计算emp每个部门中每个岗位的最高薪水
    select t.deptno, t.job, max(t.sal) as  max_sal from emp t group by t.deptno, t.job;
    
2.2 Having语句
  • having 与 where 不同点

    • where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据

    • where后面不能写分组函数,而having后面可以使用分组函数

    • having只用于group by分组统计语句

  • 案例实操

    • 求每个部门的平均工资
    select deptno, avg(sal) from emp group by deptno;
    
    • 求每个部门的平均薪水大于2000的部门
    select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
    

3. join语句(25分钟)

3.1 等值 join
  • Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接。

  • 案例实操

    • 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
    select e.empno, e.ename, d.deptno, d.dname from emp e join dept don e.deptno = d.deptno;
    
3.2 表的别名
  • 好处

    • 使用别名可以简化查询。

    • 使用表名前缀可以提高执行效率。

  • 案例实操

    • 合并老师与课程表
    select * from teacher t join course c on t.id = c.id;
    
3.3 内连接 inner join
  • 内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
    • join默认是inner join
  • 案例实操
select * from teacher t inner join course c  on t.id = c.id;
3.4 左外连接 left outer join
  • 左外连接:join操作符左边表中符合where子句的所有记录将会被返回。

  • 案例实操

    • 查询老师对应的课程
     select * from teacher t left outer join course c  on t.id = c.id;
    
3.5 右外连接 right outer join
  • 右外连接:join操作符右边表中符合where子句的所有记录将会被返回。

  • 案例实操

     select * from teacher t right outer join course c  on t.id = c.id;
    
3.6 满外连接 full outer join
  • 满外连接:将会返回所有表中符合where语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用null值替代。

  • 案例实操

    select * from teacher t full outer join course c  on t.id = c.id;
    
3.7 多表连接
  • 多个表使用join进行连接

  • 注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。

  • 案例实操

    • 多表连接查询,查询老师对应的课程,以及对应的分数,对应的学生
    select * from teacher t  left join course c on t.id = c.idleft join score s on s.sid = c.cidleft join student stu on s.s_id = stu.s_id;
    

4. 排序

4.1 order by 全局排序
  • order by 说明

    • 全局排序,只有一个reduce
    • 使用 ORDER BY 子句排序
      • asc ( ascend)
        • 升序 (默认)
      • desc (descend)
        • 降序
    • order by 子句在select语句的结尾
  • 案例实操

    • 查询学生的成绩,并按照分数降序排列
    select * from student s order by score desc ;
    
4.2 按照别名排序
  • 按照学生分数的平均值排序
select s.sid,s.tname, avg(score)  as score_avg  from student s  group by  s.sid,s.tname order by score_avg  desc;
4.3 多个列排序
  • 按照学生分数和年龄升序排序
select *  from student s order by score,age;
4.4 每个MapReduce内部排序(Sort By)局部排序
  • sort by:每个reducer内部进行排序,对全局结果集来说不是排序。

    • 1、设置reduce个数

      set mapreduce.job.reduces=3;
      
      • 2、查看设置reduce个数

        set mapreduce.job.reduces;
        
    • 3、查询成绩按照成绩降序排列

       select * from student s sort by s.score;
      
    • 4、将查询结果导入到文件中(按照成绩降序排列)

      insert overwrite local directory '/home/hadoop/hivedata/sort' select * from student s sort by s.score;
      
4.5 distribute by 分区排序
  • distribute by:类似MR中partition,采集hash算法,在map端将查询的结果中hash值相同的结果分发到对应的reduce文件中。结合sort by使用。

  • 注意

    • Hive要求 distribute by 语句要写在 sort by 语句之前。
  • 案例实操

    • 先按照学生 sid 进行分区,再按照学生成绩进行排序

      • 设置reduce的个数
      set mapreduce.job.reduces=3;
      
      • 通过distribute by 进行数据的分区,,将不同的sid 划分到对应的reduce当中去
      insert overwrite local directory '/home/hadoop/hivedata/distribute' select * from student distribute by sid sort by score;
      
4.6 cluster by
  • 当distribute by和sort by字段相同时,可以使用cluster by方式

  • 除了distribute by 的功能外,还会对该字段进行排序,所以cluster by = distribute by + sort by

    --以下两种写法等价insert overwrite local directory '/home/hadoop/hivedata/distribute_sort' 
    select * from student distribute  by score sort  by score;insert overwrite local directory '/home/hadoop/hivedata/cluster' 
    select * from student cluster by score;

五、拓展

5.1 case … when … then 语句
  • case …when …then 语句和if 条件语句类似,用于处理单个列的查询结果

  • 案例实战

    • 创建表
    create table employee(
    empid int, 
    deptid int,
    sex string,
    salary double
    )row format delimited 
    fields terminated by ' ';
    • 数据文件 employee.txt
    1       10      female  5500.0
    2       10      male    4500.0
    3       20      female  1900.0
    4       20      male    4800.0
    5       40      female  6500.0
    6       40      female  14500.0
    7       40      male    44500.0
    8       50      male    6500.0
    9       50      male    7500.0
    
    • 查询统计

      • 将员工按照性别打上标识
      select *,
      case sex
      when "female" then 1 
      when "male" then 0
      end as flag 
      from employee;
      
      • 将员工按照薪资待遇划分等级
      select *,
      case 
      when salary < 5000 then "低等收入" 
      when salary>= 5000 and salary < 10000 then "中等收入"
      when salary > 10000 then "高等收入"  
      end  as level 
      from employee;
      
⭐️5.2 什么情况下Hive可以避免进行MapReduce
  • hive 为了执行效率考虑,简单的查询,就是只是select,不带count,sum,group by这样的,都不走map/reduce,直接读取hdfs目录中的文件进行filter过滤。也就是所谓的本地模式

    • 1、直接查询表的数据 不会进行Mapreduce

      select * from employee;
      
    • 2、查询语句中的过滤条件只是分区字段的情况下 不会进行Mapreduce。

      select * from order_partition where month='2019-03';
      
    • 此外,如果设置属性 set hive.exec.mode.local.auto=true; hive还是会尝试使用本地模式。

六、总结

在这里插入图片描述

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

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

相关文章

MacDroid for Mac v2.3 安卓手机文件传输助手 支持M、Intel芯片 4.7K

MacDroid 是Mac毒搜集到的一款安卓手机文件传输助手&#xff0c;在Mac和Android设备之间传输文件。您只需要将安卓手机使用 USB 连接到 Mac 电脑上即可将安卓设备挂载为本地磁盘&#xff0c;就像编辑mac磁盘上的文件一样编辑安卓设备上的文件&#xff0c;MacDroid支持所有 Andr…

题解:洛谷 P2199 最后的迷宫

题目https://www.luogu.com.cn/problem/P2199 显然&#xff0c;数据最大 &#xff0c;数组我们开不下&#xff0c;动态开数组。 对于每一个查询&#xff0c;从起点开始&#xff0c;走一步判断是否能看到火焰杯。 如果已经没法走了&#xff0c;直接拆墙&#xff0c;输出 Poor…

如何在Github上面上传本地文件夹

前言 直接在GitHub网址上面上传文件夹是不行的&#xff0c;需要一层一层创建然后上传&#xff0c;而且文件的大小也有限制&#xff0c;使用Git进行上传更加方便和实用 1.下载和安装Git Git - Downloads 傻瓜式安装即可 2.获取密钥对 打开自己的Github&#xff0c;创建SSH密钥&…

vscode接入ai插件(免费版)

一、安装插件 扩展程序搜索tongyilingma 点击install安装 二、登录阿里云 安装好之后左侧会出现通义的图标。 点击通义图标&#xff0c;右上角登录。 登陆成功后即可使用。 三、位置 在左边可能不太符合编码习惯&#xff0c;我们点击右侧位置图标&#xff0c;把通义图标拖…

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错,网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程2. 页面探索2.1 设置管理账号2.2 添加ollama支持的模型3. 创建知识库4. 创建一个聊…

如何利用SpringSecurity进行认证与授权

目录 一、SpringSecurity简介 1.1 入门Demo 二、认证 ?编辑 2.1 SpringSecurity完整流程 2.2 认证流程详解 ?2.3 自定义认证实现 2.3.1 数据库校验用户 2.3.2 密码加密存储 2.3.3 登录接口实现 2.3.4 认证过滤器 2.3.5 退出登录? 三、授权 3.1 权限系统作用 …

非平稳时间序列分析(二)——ARIMA(p, d, q)模型

此前篇章&#xff08;平稳序列&#xff09;&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 时间序列分析&#xff08;四&#xff09;—…

【软考-架构】1.2、指令系统-存储系统-cache

GitHub地址&#xff1a;https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程&#xff1a;取指令一一分析指令一一执行指令三个步骤&#xff0c;首先将程序计数器PC中的指令地址取出&#xff0c;送入地址总线&#xff0c;CPU依据…

家用可燃气体探测器——家庭燃气安全的坚实防线

随着社会的发展和变迁&#xff0c;天然气为我们的生活带来了诸多便利&#xff0c;无论是烹饪美食&#xff0c;还是温暖取暖&#xff0c;都离不开它的支持。然而&#xff0c;燃气安全隐患如影随形&#xff0c;一旦发生泄漏&#xff0c;可能引发爆炸、火灾等严重事故&#xff0c;…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏&#xff0c;本文将通过鸿蒙 ArkUI 框架的实现代码&#xff0c;逐步解析其核心技术点&#xff0c;包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块&#xff1a; ├── entry…

分布式日志和责任链路

目录 日志问题 责任链问题 分布式日志 GrayLog简介 部署安装 收集日志 配置Inputs 集成微服务 日志回收策略 搜索语法 搜索语法 自定义展示字段 日志统计仪表盘 创建仪表盘 链路追踪 APM 什么是APM 原理 技术选型 Skywalking简介 部署安装 微服务探针 整合…

进程间通信(IPC)与匿名管道

目录 一、进程间通信&#xff08;IPC&#xff09;概述 1. 核心概念 2. 核心目的 3. IPC分类 二、匿名管道 1. 什么是管道 示例&#xff1a;Shell中的管道 2. 匿名管道的原理 3. 匿名管道的实现 3.1 创建管道&#xff1a;pipe()函数 3.2 使用 fork 共享管道 3.3 站在…

构建智能 SQL 查询代理agent,把整个查询过程模块化,既能自动判断使用哪些表,又能自动生成 SQL 语句,最终返回查询结果

示例代码&#xff1a; import os import getpass from dotenv import load_dotenv from pyprojroot import here from typing import List from pprint import pprint from pydantic import BaseModel from langchain_core.tools import tool from langchain_core.runnables i…

从矩阵乘法探秘Transformer

目录 前言1. transformer背景1.1 回顾线性代数的知识1.1.1 矩阵和行向量1.1.2 矩阵相乘和算子作用1.1.3 从分块矩阵的乘法来看 Q K T V QK^TV QKTV 1.2 encoder-decoder1.3 低阶到高阶语义向量的转换1.4 核心的问题 2. transformer网络结构2.1 基于KV查询的相似性计算2.2 在一个…

用友NC系列漏洞检测利用工具

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 YongYouNcTool启动及适配环境核心功能界面预览一键检测命令执…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

zookeeper-docker版

Zookeeper-docker版 1 zookeeper概述 1.1 什么是zookeeper Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调&#xff08;Coordination&#xff09;服务&#xff0c;它是一个为分布式应用提供一致性服务的软件。 1.2 zookeeper应用场景 zookeeper是一个经典的分…

【数据结构】LRUCache|并查集

目录 一、LRUCache 1.概念 2.实现:哈希表双向链表 3.JDK中类似LRUCahe的数据结构LinkedHashMap &#x1f525;4.OJ练习 二、并查集 1. 并查集原理 2.并查集代码实现 3.并查集OJ 一、LRUCache 1.概念 最近最少使用的&#xff0c;一直Cache替换算法 LRU是Least Recent…

AUTOSAR简介

目录 核心目标 架构分层 核心优势 经典AUTOSAR vs 自适应AUTOSAR 典型应用场景 挑战与未来发展 相关企业介绍 1. 传统汽车电子供应商&#xff08;Tier1&#xff09; 2. 软件服务商与工具链企业 3. 新兴科技公司与自动驾驶企业 4. 基础软件与工具链企业 5. 高校与研…

国产开源AI平台Cherry Studio详解:联网搜索升级与ChatBox对比指南

文章概述 Cherry Studio是一款功能强大的国产开源AI工具&#xff0c;支持本地部署、知识库管理、多模型聚合和联网搜索等特性。本文将详细介绍Cherry Studio的核心功能、1.0版本新特性及与ChatBox的对比分析&#xff0c;帮助用户选择最适合自己的AI助手工具。 Cherry Studio核…