大数据之hive(数据仓库工具)的分组和分区操作

2023-11-20

注:在对hive的概念、优缺点、安装部署和参数配置在之后再进行总结,本小节主要对hive中的分组和分区进行总结。

一、分组

1、group by语句

group by通常和聚合函数一起使用,按照一个或者多个列进行分组,然后对每个组进行聚合操作。

例如:计算员工表中每个部门中每个岗位的最高工资

注:在查询过程中只能查询group by后的字段或者函数中的字段

select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;

2、having语句

在一般的分组函数后不能使用查询where语句,而having后面可以使用分组函数,having只用于group by分组统计语句。

select   字段    from   表名   where    条件     group   by       字段

或者

select   字段    from   表名   group  by    字段    having    过滤条件

注意:对于过滤条件,可以先用where,再用group  by或者是先用group  by,再用having

例如:求每个部门的平均薪水大于 2000 的部门

select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

而不使用having语句的语句为:

select deptno, avg_sal from (select deptno,avg(sal) avg_sal from emp group by deptno)t1 where avg_sal > 2000;

二、两表连接(join)

join主要对两个表通过两个相同的字段进行连接,并查询相关的结果

1、等值join

例如:根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;

select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno=d.deptno;

 2、内连接

内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。

例如:查询两个表相同字段匹配的数据

 select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

3、左外连接

左外连接:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回。

select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

4、右外连接

右外连接:JOIN 操作符右边表中符合 WHERE 子句的所有记录将会被返回。

 select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

5、满外连接

满外连接:将会返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定字 段没有符合条件的值的话,那么就使用 NULL 值替代。

select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

 6、多表连接

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

SELECT e.ename, d.dname, l.loc_name FROM emp e JOIN dept d ON d.deptno = e.deptno 
JOIN location l ON d.loc = l.loc;

7、笛卡尔积

在具体的项目中应该尽量避免这种操作,防止运行内存卡顿。

select empno, dname from emp, dept;

三、排序

排序:对表中的数据进行对某个字段进行排序

1、全局排序(order by)

order by:全局排序,只有一个reduce,因此在表中数据非常大的情况下,运行时间会很长,再实际操作中使用很少。

ASC(ascend): 升序(默认)     DESC(descend): 降序

例如:查询员工信息按工资升序(降序)排列

select * from emp order by sal(desc);

 多个列进行排序

select ename, deptno, sal from emp order by deptno, sal;

 2、每个reduce内部排序(sort by)

Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排 序,此时可以使用 sort by。

Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集 来说不是排序。

1)设置reduce个数

set mapreduce.job.reduces=3;

2)查看设置reduce个数

set mapreduce.job.reduces;

3)根据部门编号降序查看员工信息

select * from emp sort by deptno desc;

4)将查询结果导入到文件中

insert overwrite local directory '/opt/module/data/sortby-result' select * from emp sort by deptno desc;

 3、分区排序(distribute by)

Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为 了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition (自定义分区),进行分区,结合 sort by 使用。

注:对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。

insert overwrite local directory 
'/opt/module/data/distribute-result' select * from emp distribute by 
deptno sort by empno desc;

 注意: ➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后, 余数相同的分到一个区。

➢ Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。

4、Cluster by

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

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

 select * from emp cluster by deptno;
等价
 select * from emp distribute by deptno sort by deptno;

四、分区表

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率 会提高很多。

1、分区表基本操作

1)创建分区表

create table dept_par(deptno int,dname string,loc string) partitioned by(day string)
row format delimited fields terminated by '\t';

 注:分区表设置的分区字段要区别于表中字段

 2)加载数据到分区表(数据准备,在本地创建文件数据)

dept_20220225.txt
10 ACCOUNTING 1700
20 RESEARCH 1800

dept_20220226.txt
30 SALES 1900
40 OPERATIONS 1700

dept_20220227.txt
50 TEST 2000
60 DEV 1900

加载数据到具体的分区

load data inpath '/opt/module/hive/data/dept_20220225.txt' into table dept_par partition(day='20220225');

load data inpath '/opt/module/hive/data/dept_20220226.txt' into table dept_par partition(day='20220226');

load data inpath '/opt/module/hive/data/dept_20220227.txt' into table dept_par partition(day='20220227');

 即可在hdfs集群上查看加载的分区数据

 3)分区表数据查询

单分区数据查询
 select * from dept_partition where day='20220225';


多分区数据查询
 select * from dept_partition where day='20220225'
 union
 select * from dept_partition where day='20220226'
 union
 select * from dept_partition where day='20220227';

4) 增加分区

alter table dept_par add partition(day='20220228');

创建多个分区
alter table dept_partition add partition(day='20220224') 
partition(day='20220223');

5)删除分区

 alter table dept_partition drop partition (day='20220224');

同时删除多个分区
alter table dept_partition drop partition (day='20220223'), partition(day='20220228');

注:删除和增加分区以逗号区分

6)查看分区表信息

分区表结构
 desc formatted dept_partition;
查看多少个分区
 show partitions dept_partition;

2、二级分区

如果一天的数据量也很大的情况下,就要在每天下面在对每个小时的数据进行分区

1)创建二级分区

 create table dept_partition2(
 deptno int, dname string, loc string
 )
 partitioned by (day string, hour string)
 row format delimited fields terminated by '\t';

2)加载数据

load data local inpath 
'/opt/module/hive/datas/dept_20220225.txt' into table
dept_partition2 partition(day='20220225', hour='12');

3)查看分区数据

select * from dept_partition2 where day='20220225' and hour='12';

 3、动态分区调整(即分区的数据按照表字段来分区)

关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据 插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),只不过, 使用 Hive 的动态分区,需要进行相应的配置。

1)设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为 静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)

set hive.exec.dynamic.partition.mode=nonstrict

 例如::将 dept 表中的数据按照地区(loc 字段),插入到目标表 dept_partition 的相应 分区中。

创建目标分区表

 create table dept_par4(id int, name string) 
partitioned by (loc int) row format delimited fields terminated by '\t';

 设置动态分区

 insert into table dept_par4 partition(loc) select deptno, dname, loc from dept;

注:查询语句的最后字段默认为分区字段。

五、分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理 的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围 划分。

分桶是将数据集分解成更容易管理的若干部分的另一个技术。

分区针对的是数据的存储路径;分桶针对的是数据文件。

1)创建分通表

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

2)导入数据(hdfs上的数据)

 load data inpath '/student.txt' into table stu_buck;

注:Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方 式决定该条记录存放在哪个桶当中。

2、抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结 果。Hive 可以通过对表进行抽样来满足这个需求。

语法: TABLESAMPLE(BUCKET x OUT OF y)(注意:x 的值必须小于等于 y 的值)

查询表 stu_buck 中的数据(从第一个桶开始到第四个桶(4表示将全部数据随机分为四份),随机抽取一个桶的数据)。

select * from stu_buck tablesample(bucket 1 out of 4 on id);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据之hive(数据仓库工具)的分组和分区操作 的相关文章

  • 在 HIVE 中查找函数

    我想检查一个字段是否包含字符串 我想要一个如下所示的函数 FIND string to find field to search 我的数据如下所示 field to search no match in this string record
  • 将 Hive 表导出到 hdfs 中的 csv

    我知道在 Hive 中将表保存到 csv 或其他文本文件 时 分隔符存在一个已知问题 所以我想知道你们是否可以帮助我解决这个问题 我有一个现有的表 表 A 我想将其以 csv 格式保存到 hdfs 通过阅读其他回复 我相信我必须首先创建一个
  • Hive Full Outer Join为相同的Join Key返回多行

    我正在对同一列上的 4 个表进行完全外连接 我想为连接列中的每个不同值仅生成 1 行 输入是 employee1 employee1 personid employee1 name 111 aaa 222 bbb 333 ccc
  • 如何根据“^P”分隔符分隔的数据构建 Hive 表

    我的查询是 CREATE EXTERNAL TABLE gateway staging poll int total int transaction id int create time timestamp update time time
  • 如何获取hive中的数据库用户名和密码

    正在编写jdbc程序来连接hive数据库 我希望在连接 url 中提供用户名和密码 我不知道如何使用 hive QL 获取用户名和密码 有人可以帮我吗 Exception in thread main java sql SQLNonTran
  • Hive如何存储数据,什么是SerDe?

    当查询表时 SerDe 将将文件中的字节中的一行数据反序列化为 Hive 内部使用的对象来操作该行数据 执行 INSERT 或 CTAS 时 请参阅第 441 页上的 导入数据 表的 SerDe 将将 Hive 的一行数据的内部表示序列化为
  • Hive查询快速查找表大小(行数)

    是否有 Hive 查询可以快速查找表大小 即行数 而无需启动耗时的 MapReduce 作业 这就是为什么我想避免COUNT I tried DESCRIBE EXTENDED 但这产生了numRows 0这显然是不正确的 对新手问题表示歉
  • AWS Athena 扁平化来自嵌套 JSON 源的数据

    我想从 Athena 中的嵌套 JSON 创建一个表 描述的解决方案here http docs aws amazon com athena latest ug json html使用 hive Openx JsonSerDe 等工具尝试在
  • 使用 python 从 hive 读取数据时的性能问题

    我在 hive 中有一个表 其中包含 351 837 110 MB 大小 记录 我正在使用 python 读取该表并写入 sql server 在此过程中 从 hive 读取数据到 pandas dataframe 需要很长时间 当我加载整
  • Hadoop:读取ORC文件并放入RDBMS中?

    我有一个以 ORC 文件格式存储的配置单元表 我想将数据导出到 Teradata 数据库 我研究了 sqoop 但找不到导出 ORC 文件的方法 有没有办法让 sqoop 为 ORC 工作 或者有什么其他工具可以用来导出数据 Thanks
  • 计算行的排名

    我想根据一个字段对用户 ID 进行排名 对于相同的字段值 排名应该相同 该数据位于 Hive 表中 e g user value a 5 b 10 c 5 d 6 Rank a 1 c 1 d 3 b 4 我怎样才能做到这一点 可以使用ra
  • 在 Hive 中获取数据的交集

    我在配置单元中有以下数据 userid cityid 1 15 2 15 1 7 3 15 2 8 3 9 3 7 我只想保留具有 cityid 15 和 cityid 7 的用户 ID 在我的示例中 它将是用户 ID 1 和 3 我试过
  • 为 Presto 和 AWS S3 设置独立 Hive Metastore 服务

    我工作的环境中使用 S3 服务作为数据湖 但没有 AWS Athena 我正在尝试设置 Presto 以便能够查询 S3 中的数据 并且我知道我需要通过 Hive Metastore 服务将数据结构定义为 Hive 表 我正在 Docker
  • Spark SQL sql("").first().getDouble(0) 给我不一致的结果

    我有下面的查询 它应该找到列值的平均值并返回一个数字的结果 val avgVal hiveContext sql select round avg amount 4 from users payment where dt between 2
  • 获取从开始日期到结束日期的活跃周数

    我的订阅数据如下所示 数据显示用户何时购买订阅 它有user id subscription id start date and end date 我已经得出wk start and wk end从中 user subscription i
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • Spark on Hive SQL 查询错误 NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT

    针对 Hive 2 1 0 提交 Spark 1 6 0 SQL 应用程序时出现错误 Exception in thread main java lang NoSuchFieldError HIVE STATS JDBC TIMEOUT a
  • 在蜂巢中出现错误

    当我连接到 ireport 时 如果说在 hive shell 中显示表 则会出现此错误 元数据错误 java lang RuntimeException 无法实例化 org apache hadoop hive metastore Hiv
  • 使用 MySQL 作为元存储从 HIVE 查询元数据

    我正在寻找一种使用 HiveQL 命令查询 HIVE 数据元数据的方法 我配置了一个 MySQL 元存储 但需要通过 HIVE 命令查询元数据 因为然后我想通过 ODBC 连接到 HIVE 系统来访问数据 要从 Hive 查看它们 必须使用
  • Hive 聚集在多个列上

    据我所知 当配置单元表聚集在一列上时 它会执行该分桶列的哈希函数 然后将该行数据放入其中一个桶中 每个桶都有一个文件 即如果有 32 个桶 那么 hdfs 中就有 32 个文件 将 clustered by 放在多个列上意味着什么 例如 假

随机推荐

  • Anaconda配置

    Anaconda配置 创建环境 conda create n 环境名 python 3 8 移除环境 conda remove n 环境名 all 查看所有环境 conda env list 激活环境 conda activate 环境名
  • 华为OD机试 - 组装最大可靠性设备(Java )

    题目描述 一个设备由N种类型元器件组成 每种类型元器件只需要一个 类型type编号从0 N 1 每个元器件均有可靠性属性reliability 可靠性越高的器件其价格price越贵 而设备的可靠性由组成设备的所有器件中可靠性最低的器件决定
  • wxwidgets编写多线程程序--wxThread

    细节描述 线程基本上来说是应用程序中一条单独执行的路径 线程有时被称为轻量级进程 但线程与进程的根本不同之处在于不同进程存储空间是相互独立的 而同一进程里的所有线程共享同一地址空间 尽管这使得它更容易共享几个线程间的普通数据 但这也使得它有
  • 企业微信群:机器人实现定时提醒功能

    如果每天都需要 或者经常需要提醒企业微信群里面的人做某一件事情的话 靠人力去实现比较费力 而且偶尔忘记 正好 企业微信群有一个机器人 正可以实现这一功能 1 首先 在企业微信群 添加一个机器人 2 根据企业微信机器人的配置说明 编写程序 这
  • NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.

    出现这个原因就是在指定位置没有找到你想要获取的文件 1 检查你的文件名是否正确 2 你存文件是否带了文件夹 如果带了文件夹 检查文件夹是否正确 本文仅作为笔记
  • List集合的加减操作

    文章目录 一 对List本身有改变 二 对List本身无改变 参考资料 一 对List本身有改变 概述 List1 addAll List2 List1与List2两个集合相加 返回boolean值 原有List1值有变化 List2不变
  • 1-9 人机交互的角度

    操作系统的人机交互部分 OS改善人机界面 为用户使用计算机提供良好的环境 人机交互设备包括传统的终端设备和新型的模式识别设备 OS的人机交互部分用于控制有关设备运行和理解执行设备传来的命令 人机交互功能是决定计算机系统友善性的重要因素 是当
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded
  • ros_control学习

    前言 ROS中提供了丰富的机器人应用 SLAM 导航 MoveIt 但是你可能一直有一个疑问 这些功能包到底应该怎么样用到我们的机器人上 也就是说在应用和实际机器人或者机器人仿真器之间 缺少一个连接两者的东西 ros control就是RO
  • MySQL之数据类型

    目录 一 MySQL数据类型分类 二 数值类型 1 整数类型 2 bit类型 3 小数类型 三 字符串类型 1 char 2 varchar 3 char和varchar比较 四 日期和时间类型 五 enum和set 一 MySQL数据类型
  • C#短信接口开发经验及具体开发实现

    一 配置文件app config
  • Unicode编码小结

    Unicode编码 一 ASCLL码 ASCII American Standard Code for Information Interchange 美国信息交换标准代码 是基于拉丁字母的一套电脑编码系统 主要用于显示现代英语和其他西欧语
  • Flutter 扫描插件开发qrscan

    首先在pubspec yaml中集成 dependencies qrscan 0 2 17 在androd清单文件中加入以下权限
  • Ubuntu安装X11

    Qt实现linux无边框界面需要用到Xlib 安装X11命令如下 sudo apt get install libx11 dev libxext dev libxtst dev libxrender dev libxmu dev libxm
  • align-content 设置多行下的子元素排列方式 代码和图片展示

    align content 适用于 换行 多行 的情况下 单行无效 可以设置上对齐 居中拉伸和平均分配剩余空间等属性值 属性值 flex start 默认值 在侧轴头部开始排列 flex end 在侧轴尾部开始排列 center 在侧轴中间
  • 编程练习3-将文件a处理为文件b

    初始文件a txt a b c d e f o p q r s t 处理后文件b txt a b a b c d a b c d e f o p o p q r o p q r s t shell bin bash array1 awk p
  • 虚拟主机的数据库服务器怎么填,虚拟主机的数据库服务器怎么填

    虚拟主机的数据库服务器怎么填 内容精选 换一换 云服务器备份 云服务器备份可以对普通服务器进行整机备份或部分磁盘备份 不适用于部署了数据库等应用的服务器 支持备份弹性云服务器ECS和裸金属服务器BMS 成本相对于VBS较高 适合对需要备份整
  • anaconda 创建虚拟环境

    创建虚拟环境 conda create n 名字 python 版本号 e g conda create n test python 3 10 删除虚拟环境 conda remove n 名字 all e g conda remove n
  • 大数据之hive(数据仓库工具)的分组和分区操作

    注 在对hive的概念 优缺点 安装部署和参数配置在之后再进行总结 本小节主要对hive中的分组和分区进行总结 一 分组 1 group by语句 group by通常和聚合函数一起使用 按照一个或者多个列进行分组 然后对每个组进行聚合操作