HiveQL练习(hive3.x)

news2024/10/6 12:21:48

零、准备工作

1. Hive环境安装

参见搭建Hive 3.x环境(CentOS 9 + Hadoop3.x)

2. 准备数据

在虚拟机HOME目录创建如下文件内容:

cd /root
vi emp.csv

内容如下:

7369,SMITH,CLERK,7902,1980/12/17,800,,20
7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30
7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30
7566,JONES,MANAGER,7839,1981/4/2,2975,,20
7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981/5/1,2850,,30
7782,CLARK,MANAGER,7839,1981/6/9,2450,,10
7788,SCOTT,ANALYST,7566,1987/4/19,3000,,20
7839,KING,PRESIDENT,,1981/11/17,5000,,10
7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30
7876,ADAMS,CLERK,7788,1987/5/23,1100,,20
7900,JAMES,CLERK,7698,1981/12/3,950,,30
7902,FORD,ANALYST,7566,1981/12/3,3000,,20
7934,MILLER,CLERK,7782,1982/1/23,1300,,10
vi dept.csv

内容如下:

10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

3. 进入Hive CLI

在hadoop1上执行下面命令启动Hadoop集群

start-all.sh
mapred --daemon start historyserver

在hadoop2上启动MetaStore服务

nohup hive --service metastore &

在hadoop2或者hadoop3上进入Hive CLI

hive

一、HQL基本练习

1. 上传数据

创建HDFS目录/hivedata

hive> dfs -mkdir /hivedata;

上传数据到/hive_test

hive> dfs -put /root/emp.csv /hivedata;
hive> dfs -put /root/dept.csv /hivedata;

验证数据是否上传成功

hive> dfs -ls /hivedata;

在这里插入图片描述

Hive Cli可以执行如下几类命令,需要注意的是命令要使用;作为结束符:

  • 执行Shell命令

在Hive中,你可以使用!符号来执行Shell命令。例如,你可以在Hive中执行ls命令来列出Linux根目录下的文件。

hive > !ls;
  • 执行HDFS命令

在Hive中,你也可以直接使用HDFS命令来操作HDFS上的文件。例如,你可以使用dfs -mkdir命令来创建一个新的目录。

hive > dfs -mkdir /jsuttest;
  • 执行HQL

在Hive中,你可以执行HQL语句。

hive > show databases;

2. 数据库的基本操作

hive> show databases --查看数据库;
hive> create database tmp_db location '/home/hive/db/tmp_db' --创建数据库时指定位置;
hive> desc database tmp_db --查看一下数据库的信息;

#查看一下数据库的HDFS目录;
hive> dfs -ls -R /home/hive/db/;
hive> drop database tmp_db --删除数据库;

hive> create database test_db;
hive> use test_db;
hive> select current_database()  --查看当前使用的数据库;
#观察HDFS的目录变化;
hive> dfs -ls -R /user/hive;

3. 内部表的基本操作

hive> create table emp
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) 
    > row format delimited fields terminated by ',';
hive> desc emp;
hive> desc formatted emp;
hive> load data inpath '/hivedata/emp.csv' into table emp; 

#观察HDFS目录变化;
hive> dfs -ls -R /user/hive/warehouse;
hive> dfs -ls -R /hivedata;

hive> select * from emp;
hive> drop table emp  --删除表;

#观察HDFS目录变化;
hive> dfs -ls -R /user/hive/warehouse;

4. 外部表的基本操作

hive> dfs -mkdir -p /hivedata/emp.tb;
hive> dfs -put /root/emp.csv /hivedata/emp.tb;
hive> create external table emp
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) 
    > row format delimited fields terminated by ','
    > location '/hivedata/emp.tb';

hive> desc formatted emp;

#观察HDFS目录变化;
hive> dfs -ls -R /user/hive/warehouse;
hive> dfs -ls -R /hivedata/emp.tb;

hive> select * from emp;
hive> drop table emp  --删除表;

#观察HDFS目录变化;
hive> dfs -ls -R /hivedata/emp.tb;

5. 分区表的基本操作

hive> create external table emp_ext
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) 
    > row format delimited fields terminated by ','
    > location '/hivedata/emp.tb';
hive> create table emp_partition
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int)
    > partitioned by (deptno int)
    > row format delimited fields terminated by ',';
hive> desc emp_partition  --查看表的信息;
hive> insert into table emp_partition partition(deptno=10) 
    > select empno,ename,job,mgr,hiredate,sal,comm from emp_ext where deptno=10  --插入一个分区的数据;
hive> insert into table emp_partition partition(deptno=20) 
    > select empno,ename,job,mgr,hiredate,sal,comm from emp_ext where deptno=20;
hive> select * from emp_partition;
hive> dfs -ls -R /user/hive;
hive> dfs -cat /user/hive/warehouse/test_db.db/emp_partition/deptno=10/000000_0;
hive> show partitions emp_partition  --查看分区个数;
hive> desc formatted emp_partition;

#hdfs新建一个目录;
hive> dfs -mkdir /user/hive/warehouse/test_db.db/emp_partition/deptno=30;  
hive> show partitions emp_partition  --查看分区;
hive> msck repair table emp_partition  --修复表;
hive> show partitions emp_partition   --查看分区;

6. 桶表

hive> create table emp_bucket
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int)
    > clustered by(ename) into 2 buckets;
hive> insert into emp_bucket select * from emp_ext;
#观察HDFS目录变化;
hive> dfs -ls -R /user/hive;
hive> select * from emp_bucket;

7. 其他

hive> alter table emp_ext rename to emp_new;
hive> alter table emp_new set tblproperties('EXTERNAL'='FALSE');
hive> desc formatted emp_new;
hive> drop table emp_new;
hive> dfs -ls -R /hivedata;

二、查询分析

1. 数据准备

hive> create table emp
    > (empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) 
    > row format delimited fields terminated by ',';

hive> load data local inpath '/root/emp.csv' into table emp;

hive> create table dept(deptno int,dname string,loc string) 
      > row format delimited fields terminated by ',';  
hive> load data local inpath '/root/dept.csv' into table dept;

2. 简单查询

1)全表和特定列查询

hive> select * from emp --查询所有列;
hive> select empno, ename from emp --查询指定列;
hive> select distinct mgr from emp --查询有哪些管理者;

2)列别名

重命名一个列,紧跟列名,也可以在列名和别名之间使用关键字 AS

hive> select ename AS name, deptno dn from emp;

3)算术运算

+ - * 、 % & | ^ ~

hive> select empno,ename,sal*12 from emp --计算年薪;

4)LIMIT语句

hive> select * from emp limit 2;

5)常用函数

hive> select count(*) cnt from emp  --求总行数(count);
hive> select max(sal) max_sal from emp  --求工资的最大值(max);
hive> select min(sal) min_sal from emp   --求工资的最小值(min);
hive> select sum(sal) sum_sal from emp  --求工资的总和(sum);
hive> select avg(sal) avg_sal from emp  --求工资的平均值(avg);
hive> select empno,ename,sal,comm, sal*12+nvl(comm, 0) from emp  --注意NULL的处理;
hive> select empno,ename,job,sal,
    > case job when 'PRESIDENT' then sal+1000
    > when 'MANAGER' then sal+800
    > else sal+400
    > end
    > from emp  --加薪 PRESIDENT+1000,MANAGER+800,其他+400;

6)Where子句

hive> select * from emp where sal >1000;

7)Like 和 RLike

  • 使用 LIKE 运算选择类似的值, 选择条件可以包含字符或数字:

    • % 代表零个或多个字符(任意个字符)。
    • _ 代表一个字符**。**
  • RLIKE 子句是 Hive 中这个功能的一个扩展,其可以通过 Java 的正则表达式这个更强大的语言来指定匹配条件。

hive> select * from emp where ename LIKE 'A%'  --查找名字以 A 开头的员工信息;
hive> select * from emp where ename LIKE '_A%' --查找名字中第二个字母为 A 的员工信息;
hive> select * from emp where ename RLIKE '[A]'  --查找名字中带有 A 的员工信息;

8)比较运算符(Between/In/ Is Null)

等于小于小于等于大于大于等于不等NULL****安全的等于
=<<=>>=<> !=<=>
  • A [NOT] BETWEEN B AND C :A是否属于[B,C]区间,A,B,C任一为NULL, 结果为NULL

  • A IS [NOT] NULL:A是否为空

  • A IN(数值 1, 数值 2):A是否是列表中的值

  • A [NOT] LIKE B:A是否与B相似

  • A RLIKE B, A REGEXP B:B是基于Java的正则表达式

hive> select * from emp where sal =5000  --查询出薪水等于 5000 的所有员工;
hive> select * from emp where sal between 500 and 1000 --查询工资在 500 到 1000 的员工信息;
hive> select * from emp where comm is null  --查询 bonus 为空的员工信息;
hive> select * from emp where sal IN (1500, 5000) --查询工资是 1500 或 5000 的员工信息;

9) 逻辑运算符(And/Or/Not)

hive> select * from emp where sal>1000 and deptno=30   --查询薪水大于 1000,部门是 30;
hive> select * from emp where sal>1000 or deptno=30   --查询薪水大于 1000,或者部门是 30;
hive> select * from emp where deptno not IN(30, 20)   --查询除了 20 部门和 30 部门以外的员工信息;

10) 分组

  • Group By 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
hive> select deptno, avg(sal) avg_sal from emp group by deptno  --计算 emp 表每个部门的平均工资;
hive> select deptno, job, max(e.sal) max_sal from emp e group by deptno, job   --计算 emp 每个部门中每个岗位的最高薪水;
  • Having 语句 与 where 不同: where 后面不能写分组函数,而 having 后面可以使用分组函数;having 只用于 group by 分组统计语句。
hive> select deptno, avg(sal) from emp group by deptno   --求每个部门的平均工资;
hive> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000   --求每个部门的平均薪水大于 2000 的部门;

11) Join语句

  • 内连接

  • 左(右)外连接

  • 全外连接: full join

  • 多表连接

hive> --根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
hive> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno  --内连接;
hive> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno  --左连接;

12)排序

  • 全局排序(Order By)
    • Order By:全局排序,只有一个 Reducer;
    • 排序方式:ASC(ascend): 升序(默认)DESC(descend): 降序
hive> select * from emp order by sal desc --按工资降序排列; 
hive> select ename, deptno, sal from emp order by deptno, sal -- 多个列排序;
  • 每个Reduce内部排序(Sort By)

Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序

hive> set mapreduce.job.reduces=3   --设置 reduce 个数;
hive> set mapreduce.job.reduces     --查看设置 reduce 个数;
hive> select * from emp sort by deptno desc   --根据部门编号降序查看员工信息;
hive> insert overwrite local directory '/home/hadoop/data/sortby-result'
    > select * from emp sort by deptno desc   --将查询结果导入到文件中(按照部门编号降序排序);
  • 分区(Distribute By)
    • Distribute By: 在有些情况下,需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。
    • 对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果
hive> set mapreduce.job.reduces=3;
hive> insert overwrite local directory '/home/hadoop/data/distribute-result' 
    > select * from emp distribute by deptno sort by empno desc   --先按照部门编号分区,再按照员工编号降序排序;
    
#查看输出目录;
hive> !ls /home/hadoop/data/distribute-result;
  • Cluster By

当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。

cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。

hive> select * from emp cluster by deptno;
hive> select * from emp distribute by deptno sort by deptno;

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

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

相关文章

基于STM32的快递小车无人驾驶系统

目录 摘 要 一、绪论 1.1 背景和意义 1.1.1 背景 1.1.1 意义 1.2 国内外研究现状 二、小车设计方案 2.1 方案一 2.2 方案二 2.3 方案三 2.4 方案选择与论证 三、硬件设计方案 3.1 单片机最小系统 3.2 光耦隔离电路 3.3 电源模块电路 3.4 直流电机驱动电路 3.…

Lua脚本使用手册(Redis篇)

Lua脚本 **简介&#xff1a;**Lua是一种功能强大的&#xff0c;高效&#xff0c;轻量级&#xff0c;可嵌入的脚本语言。它是动态类型语言&#xff0c;通过使用基于寄存器的虚拟机解释字节码运行&#xff0c;并具有增量垃圾收集的自动内存管理&#xff0c;是配置&#xff0c;脚…

数据资产与数据要素的重要性及数据资产入表的实践指南

## 引言在当今快速发展的数字化时代&#xff0c;数据资产已经成为企业最宝贵的资源之一。数据资产不仅对企业的运营决策有着至关重要的影响&#xff0c;而且在企业的财务健康和市场竞争力方面扮演着核心角色。数据要素&#xff0c;作为构成数据资产的基本单元&#xff0c;其管理…

【攻防世界】bug

垂直越权IP绕过文件上传 文件上传绕过&#xff1a; 1. mime检测 2. 大小写绕过 3. 等价替换&#xff08;php5&#xff0c;php3&#xff09; 4. 利用JavaScript执行php代码&#xff08;正常的php代码会被检测到&#xff0c;所以就用JavaScript来执行&#xff09; <script lan…

终端工具命令行颜色配置(解决终端工具连上服务器之后,无颜色问题)

本期主题&#xff1a; 讲解使用mobaxterm等终端工具连上服务器&#xff0c;但是命令行没有颜色的问题 目录 1. 问题描述2. 原因解释3.测试 1. 问题描述 使用终端工具&#xff08;Mobaxterm等&#xff09;连上服务器之后&#xff0c;发现终端工具没有颜色&#xff0c;如下图&am…

数模 线性规划模型理论与实践

线性规划模型理论与实践 1.1 线性规划问题 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支一数学规划&#xff0c;而线性规划(Linear Programming 简记LP)则是数学规划的一个…

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([&#xff1a;这表示创建一个转换组合&#xff0c;将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip()&#xff1a;这个操作是随机水平翻转图像&#xff0c;以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

系统架构最佳实践 -- 金融企业的资损防控

一、资损产生的原因 由于支付行业的特殊性与复杂性&#xff08;主要处理资金相关业务&#xff09;&#xff0c;支付公司处于资损的风口浪尖&#xff0c;最容易发生资损&#xff0c;可以说资损风险无处不在。 常规来说&#xff0c;资损原因主要可以分为以下三类&#xff1a; 1…

Linux设备驱动开发-字符设备

阅读引言&#xff1a; 从linux文件的种类、字符设备的创建、设备号、申请设备号、cdev对象和字符设备的对应关系、应用层调用到我们编写的设备驱动方法合集的流程。 目录 一、Linux文件的种类 二、Linux对设备的分类 三、驱动程序如何向应用层提供接口 四、Linux中设备的划…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

华为机考入门python3--(15)牛客15-求int型正整数在内存中存储时1的个数

分类&#xff1a;二进制 知识点&#xff1a; int转二进制 binary bin(n)[2:] 题目来自【牛客】 def count_ones_in_binary(n): # 将输入的整数转换为二进制字符串 # bin(n)为0b11011binary bin(n)[2:]# 初始化计数器为0 count 0 # 遍历二进制字符串的每一位 fo…

2024年大唐杯备考

努力更新中…… 第一章 网络架构和组网部署 1.1 5G的网络整体架构 5G网络中的中传、回传、前传&#xff08;这里属于承载网的概念&#xff09; CU和DU之间是中传 BBU和5GC之间是回传 BBU和AAU之间是前传&#xff08;这个好记&#xff09; 这里竟然还藏了MEC&#xff08;…

YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: &#x1f680;】 针对大尺度图像&#xff08;如遥感影像、大尺度工业检测图像等&#xff09;&#xff0c;由于设备的限制&#xff0c;无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练&#xff0c;再将训练结果…

使用Python的Pillow库进行图像处理书法参赛作品

介绍&#xff1a; 在计算机视觉和图像处理领域&#xff0c;Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具&#xff0c;使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件&#xff0c;并对选中的图像进行调整和…

STM32常见调试工具介绍

STM32的常见调试工具主要包括ST-LINK、USB转TTL、USB转485以及USB转CAN。这些工具在嵌入式系统开发、调试以及通信中发挥着重要的作用。 1.ST-LINK&#xff1a; ST-LINK是STMicroelectronics公司专为其STM32系列微控制器开发的调试和编程工具。既能仿真也能将编译好的程序下载…

python应用-os库操作目录

python自带的os模块提供了许多与操作系统交互的函数&#xff0c;适配多种操作系统&#xff0c;比如windows&#xff0c;mac&#xff0c;linux等&#xff0c;比如常用路径操作、进程管理、环境参数等都可通过os模块实现。 以下是自带的os.py中的前面一部分代码。 第一个红框中主…

asp.net core 网页接入微信扫码登录

创建微信开放平台账号&#xff0c;然后创建网页应用 获取appid和appsecret 前端使用的vue&#xff0c;安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…

Qt快速入门(Opencv小案例之人脸识别)

Qt快速入门&#xff08;Opencv小案例之人脸识别&#xff09; 编译出错记录 背景 因为主要使用qt&#xff0c;并且官网下载的win版本的编译好的opencv默认是vc的&#xff0c;所以我们需要自己下载opencv的源码使用mingw自行编译&#xff0c;我直接使用的vscode。 报错 报错…

LabVIEW直流稳定电源自动化校准系统

LabVIEW直流稳定电源自动化校准系统 直流稳定电源正向着智能化、高精度、多通道、宽量程的方向发展。基于LabVIEW开发环境&#xff0c;设计并实现了一种直流稳定电源自动化校准系统&#xff0c;以提升校准过程的整体效能&#xff0c;实现自动化设备替代人工进行电源校准工作。…

YOLOv8 测试 5:Linux 中 Docker 部署 YOLOv8,Python 封装 API 接口,base64 图片处理

一、前言 记录时间 [2024-4-14] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;二&#xff09;&#xff1a;在 Linux 中部署 Docker&#xff08;Centos7 下安装 docker、环境配置&#xff0c;以及镜像简单使用&#xff09; API 接口简单使用&#xff08;二&#xff09;…