Hive 操作基础(进阶篇✌️)

Hive 进阶操作

分区表

创建分区表

create table score_part(字段名 字段类型,字段名 字段类型 )partitioned by (分区字段 分区类型) 
row format delimited fields terminated by '\t';

创建单极分区表

注意: 分区的列名不能和数据列名相同.分区列会当做虚拟列出现在数据列的后面.
create table order_one_part(id int,pname string,price int,uint int  )partitioned by (year string) 
row format delimited fields terminated by ' ';---添加数据
load data inpath '/order202251.txt' into table order_one_part partition(year='2022');
load data inpath '/order202351.txt' into table order_one_part partition(year='2023');
load data inpath '/order202352.txt' into table order_one_part partition(year='2023');-- 查询数据 -- 查询2022年的所有订单
-- 查询2022的数据2023目录中的数据没有参数进来.查询效率高.避免全表扫描.
select * from order_one_part where year='2022'; 
-- 全查
select * from order_one_part; -- 不会提升效率

创建多分区表

-- 注意: 分区的列名不能和数据列名相同.分区列会当做虚拟列出现在数据列的后面.
create table order_multi_part(id int,pname string,price int,uint int  )partitioned by 
(year string,month string,day string) row format delimited fields terminated by ' ';---添加数据
load data inpath '/order202251.txt' into table order_multi_part partition(year='2022',month='5',day='1');
load data inpath '/order202351.txt' into table order_multi_part partition(year='2023',month='5',day='1');
load data inpath '/order202352.txt' into table order_multi_part partition(year='2023',month='5',day='2');
load data inpath '/order2023415.txt' into table order_multi_part partition(year='2023',month='4',day='15');-- 查询2023年5月1号中的数据.查询效率高.避免全表扫描.
select * from order_multi_part where year='2023' and month='5' and day='1'; 

增删改查

添加分区: alter table 表名 add partition(分区字段='分区值');  删除分区: alter table 表名 drop partition(分区字段='分区值');修改分区名:  alter table 表名 partition(分区字段='分区值') rename to partition(分区字段='分区值');查看所有分区: show partitions 表名;

修复分区

msck repair table 表名;

多级分区练习题

已知2023年产生的业务数据,存在文件order51.txt,order52.txt,order415.txt三个

-- 1.要求查询2023年全年数据

-- 2.要求查询2023年每个商品对应的销售额 -- select 后的字段要么在groupby后出现要么在聚合函数内出现

-- 3.要求查询2023年全年商品总销售额

-- 4.要求查询2023年5月的所有商品的所有商品销售情况

-- 5.要求查询2023年5月1号的所有商品信息

-- 6.要求查询2023年5月1号的所有商品的总销量

-- 创建分区表
create table order_multi_part(pid int,pname string,price double,quantity int
)partitioned by (year string,month string,day string)
row format delimited
fields terminated by ' ';-- 加载数据文件
-- 先手动上传order51.txt,order52.txt,order415.txt文件到/binzi目录下
load data inpath '/data/order51.txt' into table order_multi_part partition (year='2023',month='5',day='1');
load data inpath '/data/order52.txt' into table order_multi_part partition (year='2023',month='5',day='2');
load data inpath '/data/order415.txt' into table order_multi_part partition (year='2023',month='4',day='15');-- 查询表
select * from order_multi_part;
-- 1.要求查询2023年全年数据
select * from order_multi_part where year = '2023';
-- 2.要求查询2023年每个商品对应的销售额
-- select 后的字段要么在groupby后出现要么在聚合函数内出现
select pname,sum(price*quantity) from order_multi_part where year = '2023' group by pname;
-- 3.要求查询2023年全年商品总销售额
select sum(price*quantity) from order_multi_part where year = '2023';
-- 4.要求查询2023年5月的所有商品的所有商品销售情况
select * from order_multi_part where year = '2023' and month = '5';
-- 5.要求查询2023年5月1号的所有商品信息
select * from order_multi_part where year = '2023' and month = '5' and day = '1';
-- 6.要求查询2023年5月1号的所有商品的总销量
select sum(quantity) from order_multi_part where year = '2023' and month = '5' and day = '1';

 分桶

分桶表

分桶可以单独使用也可以在分区表中使用  

创建分桶表:
create table 表名(字段名 字段类型,字段名 字段类型 )
clustered by (分桶字段) [sorted by (桶内排序字段)] into num buckets
row format delimited fields terminated by '分隔符';注意: 上述格式中num代表分桶的数量(如果没有额外修改reduce数量的话,默认分桶数量和reduce数量一致)分桶的原理: 首先对分桶字段值进行hash加密,然后对分桶数量进行取模,生成对应分桶文件Hash加密注意:同样的值被Hash加密后的结果是一致的,也就意味着取模结果是一样的举例: 如’binzi’ 哈希值是93742710, 无论hash对3取模多少次,结果都是0分桶的好处: 基于分桶列的特定操作,如:分组、过滤、JOIN、抽样等,均可带来性能提升分桶字段如果选择重复值较多的字段会造成数据倾斜.应该避免这种分桶操作.

分桶的原理

select hash('字符串') % 桶个数 : 哈希取模法
hash('hello') --> 99162322  --> 计算多少次都是一样的值.拿着这个值对桶个数进行模运算.结果就是桶编号.

分桶且排序

分桶后边加上sorted by 字段.可以对桶内文件进行排序.create table if not exists course_bucket3(cid int,cname string,sname string)
clustered by(cid) sorted by(cid) into 3 buckets
row format delimited fields terminated by '\t';load data inpath '/course.txt' into table course_bucket3;--加载数据select * from course_bucket3 where cid = 1;

HiveSerDe机制

COLLECTION ITEMS TERMINATED BY '分隔符' : 指定集合类型(array)/结构类型(struct)元素的分隔符
MAP KEYS TERMINATED BY '分隔符' :表示映射类型(map)键值对之间用的分隔

复杂类型Array

数据文件👉data-for-array-type.txt

-- 需求:已知data_for_array_type.txt文件,存储了学生以及居住过的城市信息,要求建hive表把对应的数据存储起来
-- zhangsan	beijing,shanghai,tianjin,hangzhou
-- wangwu	changchun,chengdu,wuhan,beijincreate table if not exists table_array(name string,address array<string>)
row format delimited fields terminated by '\t'
collection items terminated by ',';-- 加载linux上的数据到hive表中 --特点: 加载完毕后linux上的数据依然存在.
load data local inpath '/mnt/data_for_array_type.txt' into table table_array;select * from table_array;-- 需求: 查询zhangsan的地址有几个?
select address from table_array where name='zhangsan';
select name, size(address) as addr_size from table_array where name='zhangsan';-- 需求: 查询zhangsan的第二个地址?
select name,address[1] as addr from table_array where name='zhangsan';-- 需求: 查询zhangsan是否在tianjin住过?
select * from table_array where array_contains(address,'tianjin');
select name,array_contains(address,'tianjin') `入住记录` from table_array where name = 'zhangsan';

复杂类型Struct

数据文件👉data-for-struct-type.txt

-- 需求: 已知data_for_struct_type.txt文件存储了用户姓名和年龄基本信息,要求建hive表把对应的数据存储起来
-- 1#周杰轮:11:2020-01-09
-- 2#林均杰:16:2020-10-09
-- 3#刘德滑:21:2020-03-05
-- 4#张学油:26:2020-11-09
-- 5#蔡依临:23:2020-12-09create table table_struct(id int,info struct<name:string,age:int ,birth:string>)
row format delimited fields terminated by '#'
collection items terminated by ':';-- 加载数据
load data local inpath '/mnt/data_for_struct_type.txt' into table table_struct;-- 查询所有列
select * from table_struct;-- 需求: 获取所有的姓名
select info.name from table_struct;-- 需求: 获取所有的年龄
select info.age from table_struct;

复杂类型Map

数据文件👉data-for-map-type.txt

-- 需求: 查看所有人的father,mother信息
select id, name, info['father'] father, info['mother'] mother, age from test_map;-- 需求: 查看所有人的家庭相关角色
select id, name, map_keys(info) as relation from test_map;-- 需求: 查看所有人的家庭相关姓名
select id, name, map_values(info) as relation from test_map;-- 需求: 查看所有人的家庭相关人员个数
select id,name,size(info) num from test_map;-- 需求: 查看马大云是否包含brother角色
select * from test_map where array_contains(map_keys(info), 'brother');

Hive 查询语法

一般查询语法

基础查询格式: select distinct 字段名 from 表名;注意: *代表所有字段  distinct去重  as给表或者字段起别名条件查询格式: select distinct 字段名 from 表名 where 条件;比较运算符: > < >= <= != <>逻辑运算符: and or not模糊查询: %代表任意0个或者多个字符   _代表任意1个字符空判断: 为空is null   不为空is not null范围查询: x到y的连续范围:between x and y    x或者y或者z类的非连续范围: in(x,y,z)排序查询格式:  select distinct 字段名 from 表名 [where 条件] order by 排序字段名 asc|desc ;asc : 升序 默认升序desc: 降序聚合查询格式: select 聚合函数(字段名) from 表名;聚合函数: 又叫分组函数或者统计函数聚合函数: count()  sum()  avg()  max()  min()分组查询格式:  select 分组字段名,聚合函数(字段名) from 表名 [where 非聚合条件] group by 分组字段名 [having 聚合条件];注意: 当分组查询的时候,select后的字段名要么在groupby后出现过,要么放在聚合函数内,否则报错where和having区别?区别1: 书写顺序不同,where在group by关键字前,having在group by关键字后区别2: 执行顺序不同,where在分组之前过滤数据,having在分组之后过滤数据区别3: 筛选数据不同,where只能在分组之前过滤非聚合数据,having在分组之后主要过滤聚合数据区别4: 操作对象不同,where底层操作伪表,having底层操作运算区分页查询格式: select 字段名 from 表名 [ order by 排序字段名 asc|desc] limit x,y;x: 起始索引 默认从0开始,如果x为0可以省略    计算格式: x=(页数-1)*yy: 本次查询记录数

多表查询(join)

数据文件👉categorys.txt   products.txt

-- 1. 准备数据源, 建表, 添加表数据.
-- table1: 商品表
CREATE TABLE product(pid string,pname string,category_id string) row format delimited
fields terminated by ',';-- table2: 分类表
CREATE TABLE category (cid string,cname string
) row format delimited
fields terminated by ',';-- 加载数据
load data local  inpath '/mnt/join/categorys.txt' into table category;
load data local  inpath '/mnt/join/products.txt' into table product;select * from product;
-- p1,联想,c1
-- p2,小米,c2
-- p3,null,null
select * from category;
-- c1,电脑
-- c2,手机
-- c3,null-- 多表查询 cross join------交叉连接--------------
select * from product cross join category;
-- p1,联想,c1,c1,电脑
-- p1,联想,c1,c2,手机
-- p1,联想,c1,c3,null
-- p2,小米,c2,c1,电脑
-- p2,小米,c2,c2,手机
-- p2,小米,c2,c3,null
-- p3,null,null,c1,电脑
-- p3,null,null,c2,手机
-- p3,null,null,c3,null-- 多表查询 inner join------内连接--------------
select * from product inner join category on product.category_id = category.cid;
-- p1,联想,c1,c1,电脑
-- p2,小米,c2,c2,手机-- 多表查询 left join on------左外连接--------------
select * from product left join category on product.category_id = category.cid;
-- p1,联想,c1,c1,电脑
-- p2,小米,c2,c2,手机
-- p3,null,null,null,null-- 多表查询 right join on------右外连接--------------
select * from product right join category on product.category_id = category.cid;
-- p1,联想,c1,c1,电脑
-- p2,小米,c2,c2,手机
-- null,null,null,c3,null-- 多表查询 full join on------全外连接--------------
select * from product full join category on product.category_id = category.cid;
-- p2,小米,c2,c2,手机
-- p1,联想,c1,c1,电脑
-- null,null,null,c3,null
-- p3,null,null,null,null-- 多表查询 union -----联合查询--------------
select * from product left join category on product.category_id = category.cid
union
select * from product right join category on product.category_id = category.cid;
null,null,null,c3,null
p1,联想,c1,c1,电脑
p2,小米,c2,c2,手机
p3,null,null,null,null-- 多表查询 left semi join------左半连接--------------
select * from product left semi join category on product.category_id = category.cid;
-- p1,联想,c1
-- p2,小米,c2

hive有别于mysql的join

-- 多表查询 full join on------全外连接--------------
select * from product full join category on product.category_id = category.cid;
-- p2,小米,c2,c2,手机
-- p1,联想,c1,c1,电脑
-- null,null,null,c3,null
-- p3,null,null,null,null-- 多表查询 left semi join------左半连接----[内连接中左表的数据]----------
select * from product left semi join category on product.category_id = category.cid;
-- p1,联想,c1
-- p2,小米,c2

union查询

union 是上下拼接的连接查询: 要求上下字段和类型要保持一种.
主要实现功能: 把两个select查询结果上下拼接起来.
id name age
id name age # 拼接过程中会去除重复.
select id ,name ,age from student where 条件1
union
select id ,name ,age from student where 条件2;# 拼接过程中不会去重.
select id ,name ,age from student where 条件1
union all
select id ,name ,age from student where 条件2;

hive有别于mysql的排序

set mapreduce.job.reduces:  查看当前设置的reduce数量 默认结果是-1,代表自动匹配reduce数量和桶数量一致
set mapreduce.job.reduces = 数量 : -- 修改reduces数量cluster by 字段名:  分桶且正序排序   弊端: 分和排序是同一个字段,相对不灵活distribute by 字段名 sort by 字段名: distribute by负责分,sort by负责排序, 相对比较灵活order by 字段名: 只能全局排序 注意: cluster by 和 distribute by 字段名 sort by 字段名 受当前设置的reduces数量影响,但是设置的reduces数量对order by无影响,因为orderby就是全局排序,就是一个reduce建表的时候指定分桶字段和排序字段: clustered by (字段名) sorted by (字段名) into 桶数量 buckets注意: 如果建表的时候设置了桶数量,那么reduces建议设置值-1或者值大于桶数量

四个By的区别

数据文件👉students.txt

-- 创建表
create table students(id int,name string,gender string,age int,cls string
)row format delimited
fields terminated by ',';
-- 加载数据
load data inpath '/source/students.txt' into table students;
-- 验证数据
select * from students limit 1;-- 查询reduces的数量
set mapreduce.job.reduces; -- -1代表根据任务实时改变
-- cluster by 字段名 查询的时候分桶且排序
-- 注意: 如果是1个reduces那么cluster by全局升序排序
select * from students cluster by id;
-- 修改reduces数量为3
set mapreduce.job.reduces=3;
-- 再次使用cluster by查询,查看效果
-- 效果: 如果多个reduces那么cluster by桶内局部排序
select * from students cluster by id;-- distribute by + sort by
-- 设置reduces的数量为-1
set mapreduce.job.reduces = -1;
-- 默认1个ruduces数量,使用distribute by + sort by查询观察结果
-- 注意: 如果是1个ruduces那么distribute by + sort by全局排序
select * from students distribute by name sort by id desc;
-- 修改reduces数量
set mapreduce.job.reduces = 2;
-- 再次distribute by + sort by查询
-- 效果: 如果多个redueces,那么distribute by 分reduces数量个桶,sort by桶内局部排序
select * from students distribute by name sort by id desc;-- order by
-- 注意: order by 永远都是全局排序,不受reduces数量影响,每次只用1个reduces
select * from students order by id desc;

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

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

相关文章

【Kafka】Windows+KRaft部署指南

【Kafka】WindowsKRaft部署指南 摘要本地环境说明官网快速开始修改config/kraft/server.properties初始化数据存储目录启动 测试创建topic创建生产者创建消费者 FAQ输入行太长。命令语法不正确。问题描述解决方案 参考资料 摘要 Kafka是一种高吞吐量的分布式发布订阅消息系统&…

Docker-软件容器平台

一、容器 1、什么是容器 容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和 Windows…

OSS和FastDFS的区别

FastDFS&#xff1a; FastDFS 是一种开源的轻量级分布式文件系统&#xff0c;基于HTTP协议实现。具有高扩展性、高可用性和高稳定性。它解决了大容量文件存储和高效访问的问题&#xff0c;适合作为大容量文件的存储服务器。FastDFS 通过文件系统集群&#xff0c;使得用户可以将…

分离编译(介绍,解决“类模板定义和声明不在同一文件导致链接错误“的问题),类模板实例化原理,

目录 分离编译 介绍 问题代码示例 代码 说明 预处理 编译 链接 类模板实例化原理 总结 解决方法 显式实例化 模板的声明和定义放在一个头文件 分离编译 介绍 分离编译是一种编程技术 允许将程序代码分割成多个文件&#xff0c;每个文件可以独立地编译成目标文件…

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

如何做好多项目进度管理

在同时管理多个项目时&#xff0c;重要的是要确保每个项目都能按时、按质完成。有效的时间管理、资源优化配置、持续的沟通和使用专业工具是关键要素。这些元素有助于维护项目的整体质量和效率&#xff0c;确保所有项目成员的责任和期望都明确无误。本文将深入探讨如何通过实践…

如何在vscode中安装git详细新手教程

一、安装git后点击vscode中的设置 今天教大家如何在VScode中编写代码后提交到git仓库&#xff0c;如果我们不想切换到git的命令行窗口&#xff0c;可以在VScode中配置git&#xff0c;然后就可以很方便快捷的把代码提交到仓库中。 二、在输入框中输入 git.path &#xff0c;再点…

使用Docker Compose构建多容器应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …

Python-利用tkinter库编写一个exe伪恶意程序文件(下)

前言 接着上篇所讲的&#xff0c;我们已经完成了源代码的准备&#xff0c;并将其储存在了function_1.py文件中。接下来我们将把function_1.py文件编写为相对应的exe文件。那么好&#xff0c;废话不多说&#xff0c;我们直接开始。&#xff08;温馨提示&#xff1a;由于整蛊的需…

java list使用基本操作

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class Main {public static void main(String[] args) {ArrayList list new ArrayList();list.add("张三");list.add("李四");list.add("王五");l…

【C/C++】strncpy函数的模拟实现

零.导言 之前我们学习了strncpy函数&#xff0c;不妨我们现在尝试模拟实现strncpy函数的功能。 一.实现strncpy函数的要点 strncpy函数是一种字符串函数&#xff0c;可以按字节拷贝字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;…

ARM-8 定位发布版本 pstree 程序的 main 地址

逆向时如何找到main&#xff0c;如下&#xff1a; 1.readelf -h pstree ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2s complement, little endian Versi…

履带机器人(一、STM32控制部分--标准库)

一、履带机器人整体逻辑框架 通过在PC端搭建上位机,使得在PC端可以给STM32发送控制指令并且接受STM32的状态信息。 通过RS485通信,使得STM32可以和电机进行通信,STM32发送启动、停止、转速、方向等指令,并接受电机返回的状态信息。 二、STM32逻辑框架 整体逻辑: 1、先…

数据库管理-第258期 23ai:Oracle Data Redaction(20241104)

数据库管理258期 2024-11-04 数据库管理-第258期 23ai&#xff1a;Oracle Data Redaction&#xff08;20241104&#xff09;1 简介2 应用场景与有点3 多租户环境4 特性与能力4.1 全数据编校4.2 部分编校4.3 正则表达式编校4.4 随机编校4.5 空值编校4.6 无编校4.7 不同数据类型上…

Rust重写万物之——从头开始编写浏览器引擎

一款用 Rust 编写的全新“轮子”最近备受关注—— 因不满大公司垄断,Gosub 项目团队用 Rust 从头开始编写了一个新的浏览器引擎,目前 star 数已超过 3k。 Gosub 项目的诞生是因为不少用户对当前的 Web 浏览器现状感到不满。 尽管市面上有许多浏览器可供选择,但其中大多数…

Elasticsearch-linux环境部署

本文主要介绍linux下elasticsearch的部署。通过在一台linux服务器中分别对elasticsearch-6.7.2版本&#xff0c;elasticsearch-7.3.0版本来进行安装&#xff0c;记录在安装elasticsearch-7.3.0版本时出现的异常情况&#xff0c;以及elasticsearch-head的安装。 基础环境 本机已…

mac crontab 不能使用问题简记

需要 crontab 有权限&#xff0c;如下截图设置 在访达上方【前往】-》【前往文件夹】输入/ 然后按 Command Shift . 显示隐藏文件&#xff0c;然后将 usr 放到左边栏 然后如下操作 系统设置中找到 隐私安全->完全访问磁盘 点击小锁头 点击号&#xff0c;将/usr/bin/c…

2款使用.NET开发的数据库系统

今天大姚给大家分享2款使用.NET开发且开源的数据库系统。 Garnet Garnet是一款由微软研究院基于.NET开源的高性能、跨平台的分布式缓存存储数据库&#xff0c;该项目提供强大的性能&#xff08;吞吐量和延迟&#xff09;、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能…

基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

书生第四期实训营基础岛——L1G2000 玩转书生「多模态对话」与「AI搜索」产品

基础任务 MindSearch使用示例 书生浦语使用示例 书生万象使用示例 进阶任务 问题&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f; 回答截图&#xff1a; 知乎回答链接&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f;