6.Hive系列之DML数据操作(二)

语句和Mysql、PgSQL都类似,简单过一遍

# 全表查询
select * from studen;
# 列查询
select name, age from student;
# 列别名
select name AS name1, age age1 from student;
# 常用函数 count max min sum avg等
select avg(score) avg_score from student;
# 限制返回的行数
select * from student limit 5;
# 薪水大于 1000 的所有员工
select * from emp where sal>1000;
# 查找名字中带有 A 的员工信息
select * from emp where ename RLIKE '[A]';
# 每个部门的平均薪水大于 2000 的部门
select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
# 左外连接:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回
select e.empno, e.ename, d.deptno from emp e left join
dept d on e.deptno = d.deptno;
# 按照部门和工资升序排序
select ename, deptno, sal from emp order by deptno, sal;

1. 每个 Reduce 内部排序(Sort By)

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

# 设置 reduce 个数
set mapreduce.job.reduces=3;
# 查看设置 reduce 个数
set mapreduce.job.reduces;
# 根据部门编号降序查看员工信息
select * from emp sort by deptno desc;

2. 分区(Distribute By)

Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distributeby 的效果。

# 先按照部门编号分区,再按照员工编号降序排序
select * from emp distribute by deptno sort by empno desc;
➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,
余数相同的分到一个区。
➢ Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前

3. 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;

4. 分区表与分桶表

4.1 分区表

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

# 创建分区表
create table dept_partition(deptno int, dname string, loc string)
partitioned by (day string) row format delimited fields terminated by '\t';
# 加载数据 分区表加载数据时,必须指定分区
load data local inpath '/opt/module/hive/datas/dept_20200403.log' into table dept_partition partition(day='20200403');
# 查询分区表中数据
select * from dept_partition where day='20200401';
# 增加分区
alter table dept_partition add partition(day='20200404');
# 删除分区
alter table dept_partition drop partition(day='20200404');
# 查看分区表有多少分区
show partitions dept_partition;
# 查看分区表结构
desc formatted dept_partition;# 二级分区 如果一天的日志数据量也很大,将数据再拆分
create table dept_partition2(deptno int, dname string, loc string) partitioned by (day string, hour string) row format delimited fields terminated by '\t';
4.2 动态分区调整

关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据
插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition)

# 开启动态分区功能(默认 true,开启)
hive.exec.dynamic.partition=true
# 设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为
静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict
# 在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
hive.exec.max.dynamic.partitions=1000
# 在每个执行 MR 的节点上,最大可以创建多少个动态分区 该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就需要设置成大于 365,如果使用默认值 100,则会报错
hive.exec.max.dynamic.partitions.pernode=100
# 整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000
hive.exec.max.created.files=100000
# 当有空分区生成时,是否抛出异常。一般不需要设置。默认 false
hive.error.on.empty.partition=false
4.3 分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理
的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围
划分
分桶是将数据集分解成更容易管理的若干部分的另一个技术
分区针对的是数据的存储路径;分桶针对的是数据文件
分桶规则: Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方
式决定该条记录存放在哪个桶当中

# 创建分桶表
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';
# 查看表结构
hive (default)> desc formatted stu_buck;
Num Buckets: 4
# 导入数据到分桶表中,load 的方式
load data inpath '/student.txt' into table stu_buck;

分桶表操作需要注意的事项:

  • reduce 的个数设置为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个
    数设置为大于等于分桶表的桶数
  • 从 hdfs 中 load 数据到分桶表中,避免本地文件找不到问题
  • 不要使用本地模式

5. 抽样查询

select * from stu_buck tablesample(bucket 1 out of 4 on id);

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

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

相关文章

修复漏洞(一)离线升级Docker版本

前言 一般人最好用的修复漏洞的方式就是更新版本起因是使用的Docker版本被检测出来有一堆漏洞(例如:Docker 操作系统命令注入漏洞(CVE-2019-5736))更新环境无法联网,只能通过下载二进制文件的形式进行安装 步骤 可先通过which …

基于单片机的智能窗帘智能晾衣架系统的设计与实现

功能介绍 以STM32单片机单片机作为主控系统;OLED液晶显示当前环境温湿度,光照强度,时间,开关状态等信息;雨滴传感器检测当前环境是否下雨,天气下雨检测,天气潮湿时自动收衣服;可以通…

RabbitMq(一)

一、基本概念、常见工作模式以及简单使用 MQ全称Message Queue (消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 小结 MQ消息队列,存储消息的中间件分布式系统通信两种方式:直接远程调用和借助第三方完成间接通信发…

openGauss学习笔记-09 openGauss 简单数据管理-创建数据库

文章目录 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库9.1 语法格式9.2 参数说明9.3 示例 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库 数据库安装完成后,默认生成名称为postgres的数据库。您需要自己创建一个新的数据库。 9.1 语法格式…

低代码技术:提高效率降低成本的全新选择

一、前言 企业想要独立的应用程序,开发者在寻求更快速、更高效、更灵活的开发方法,以适应快速变化的市场需求。在这个背景下,低代码技术以提高效率降低成本的方式走进人们视野,成为了一种全新的应用程序开发方式。 二、相比传统的…

金融中的数学:概率分布(下)

上篇博客介绍了离散型概率分布,本篇博客介绍连续型概率分布。 1.连续型概率分布 连续型均匀分布(Continuous Uniform distribution)是一种描述在特定区间内取值均匀分布的概率分布。在该分布中,随机变量在给定区间内的取值概率密…

上门服务小程序|上门家政小程序开发

随着现代生活节奏的加快和人们对便利性的追求,上门家政服务逐渐成为了许多家庭的首选。然而,传统的家政服务存在着信息不透明、服务质量不稳定等问题,给用户带来了困扰。为了解决这些问题,上门家政小程序应运而生。上门家政小程序…

Jupyter入门使用教程

1 Jupyter Notebook与Jupyter Lab简介 Jupyter Notebook是一个开源的Web应用,在深度学习领域非常活跃。用户可以在这里创建和分享可执行代码、可视化结构和注释说明的文档。 Jupyter Notebook以网页的形式展现,用户可以在此网页中直接编辑代码、运行程…

通过 Lucene.Net 支持的 .NET 索引和搜索引擎的高效使用与探索:Examine 的简单索引与搜索数据应用以及其可扩展性分析

通过 Lucene.Net 支持的 .NET 索引和搜索引擎的高效使用与探索:Examine 的简单索引与搜索数据应用以及其可扩展性分析 在当前的技术环境中,搜索和索引数据变得越来越重要,尤其是在处理大量数据时。这就使得我们需要一种能够快速、精确、高效…

程序员如何制作PPT?

有道无术,术尚可求也;有术无道,止于术。大家好,我是程序员雪球,今天让我们一起探讨如何从零开始制作高质量的 PPT。 上周,领导要求我撰写一份关于 4到6月持续集成运营分析的报告,并通过 PPT 的形…

STM32单片机示例:多个定时器同步触发启动

文章目录 前言基础说明关键配置与代码其它补充示例链接 前言 多个定时器同步触发启动是一种比较实用的功能,这里将对此做个示例说明。 基础说明 该示例演示通过一个TIM使能时同步触发使能另一个TIM。 本例中使用TIM1作为主机,使用TIM1的使能信号作为…

win10 vscode 打包springboot项目

1 查看 java -version 2 环境变量配置 JAVA_HOME where java # D:\JDK\bin\java.exe1 在"系统变量"部分,点击"新建(N)"按钮。 2 在"变量名"字段中输入 JAVA_HOME 3 在"变量值"字段中输入 JDK 的安装路径。例如&#xff0…

基于 Linux 的轻量级多线程 HTTP 服务

使用基本的Linux系统调用来创建一个TCP socket&#xff0c;监听端口8080&#xff0c;并在接受到客户端连接时创建一个新的线程来处理连接。每个连接处理函数都是一个独立的线程&#xff0c;读取客户端请求并发送固定的HTTP响应。 代码&#xff1a; #include <iostream> …

简笔风和写实风的区别

现实主义和风格化 当我们谈论现实主义和风格化时&#xff0c;我们是什么意思&#xff1f;这看起来相当明显&#xff0c;现实主义指的是模仿逼真的逼真的图形。它不一定需要存在于现实世界中&#xff0c;但被传达为它属于我们的世界。10年前&#xff0c;我们认为现实的东西在今…

尝试-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 活动地址 三、图片生成提示词与反向提示词&#xff1a; 提示词&#xff1a;realistic portrait painting of a japanese…

Effective C++学习笔记(6)

目录 条款32. 确定你的public继承塑模出is-a关系条款33.避免遮掩继承而来的名称条款34.区分接口继承和实现继承条款35.考虑virtual函数以外的其他选择条款36.绝不重新定义继承而来的non-virtual函数条款37.绝不重新定义继承而来的缺省参数值条款38.通过复合塑模出has-a或“根据…

spring-boot-starter-parent 与 spring-boot-dependencies

Spring Boot的每个发布版本都会规划它所支持的依赖项。实际上&#xff0c;你不用指定这些依赖项的版本号&#xff0c;因为Spring Boot都为你管理好了。当更新Spring Boot时&#xff0c;会相应的更新依赖。 Maven管理依赖 Maven用户可以继承spring-boot-starter-parent项目&am…

OpenMP并行化傅里叶变换

设计思想 傅里叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。在不同的研究领域&#xff0c;傅里叶变换具有多种不同的变体形式&#xff0c;如连续傅里叶变换和离散傅里叶变换。 快速傅…

windows各种文件操作、系统相关的命令行脚本

目录 写在前面文件操作命令说明遍历文件并写进txt按行读取txt并文件计数文件重命名 参考完 写在前面 1、本文内容 windows各种文件操作、系统相关的命令行脚本 请保存为.bat运行 2、平台 windows10 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/…

《零基础入门学习Python》第047讲:魔法方法:定制序列

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 常言道&#xff1a;“无规矩不成方圆”&#xff0c;讲的是万事万物的发展都要在一定的规则下去运行&#xff0c;只有遵循一定的协议去做&#xff0c;事情才能够按照…