大数据课程F4——HIve的其他操作

文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州

 ▲ 本章节目的

⚪ 掌握HIve的join;

⚪ 掌握HIve的查询和排序

⚪ 掌握HIve的beeline

⚪ 掌握HIve的文件格式

⚪ 掌握HIve的基本架构

⚪ 掌握HIve的优化;

一、join

1. 概述

1. 在Hive中,同MySQL一样,提供了多表的连接查询,并且支持left join,right join,inner join,full outer join以及笛卡尔积查询。

2. 在连接查询的时候,如果不指定,那么默认使用的是inner join。

3. 在Hive中,除了支持上述比较常用的join以外,还支持left semi join。当a left semi join b的时候,表示获取a表中的数据哪些在b表中出现过。

2. 案例:

#建表语句

create external table orders (orderid int, orderdate string, productid int, num int) row format delimited fields terminated by ' 'location '/orders';

create external table products (productid int, name string, price double) row format delimited fields terminated by ' ' location '/products';

#左连接 - 以左表为准

select * from orders o left join products p on o.productid = p.productid;

#右连接 - 以右表为准

select * from orders o right join products p on o.productid = p.productid;

#内连接 - 获取两个表都有的数据

select * from orders o inner join products p on o.productid = p.productid;

#全外连接

select * from orders o full outer join products p on o.productid = p.productid;

#笛卡尔积

select * from orders, products;

#需求一:获取每一天卖了多少钱

select o.orderdate, sum(o.num * p.price) from orders o inner join products p on o.productid = p.productid group by o.orderdate;

#需求二:查询哪些商品被卖出去过 - 实际上就是获取商品表中的哪些数据在订单表中出现过

select * from products p left semi join orders o on p.productid = o.productid;

二、查询和排序

1. having

1. 在Hive中,where可以针对字段来进行条件查询,但是where无法针对聚合结果进行条件查询;如果需要对聚合结果进行条件查询,那么此时需要使用having。

2. 案例:

#原始数据

1 Apollo 4900

1 Billy 5100

1 Cary 4800

1 Dylan 5000

1 Ford 4700

2 Apollo 5300

2 Billy 4600

2 Cary 4700

2 Dylan 5100

2 Ford 4500

3 Apollo 5200

3 Billy 4300

3 Cary 4600

3 Dylan 5200

3 Ford 4800

#建表语句

create table salaries (month int, name string, salary double) row format delimited fields terminated by ' ';

#加载数据

load data local inpath '/home/hivedemo/salaries.txt' into table salaries;

#获取平均工资超过5000的员工

select name, avg(salary) as avgsalary from salaries group by name having avgsalary > 5000;

#或者使用子查询

select * from (select name, avg(salary) as avgsalary from salaries group by name)tmp where avgsalary > 5000;

2. 排序

1. 在Hive中,提供了2种排序方式:

a. order by:在排序的时候忽略掉ReduceTask的个数,会将所有的数据进行统一的排序。

b. sort by:在排序的时候会按照ReduceTask的个数产生对应数量的结果文件。在每一个结果文件内部进行排序。在sort by的时候如果不指定,那么会根据排序数据的哈希码来分配到多个不同的文件中。

2. sort by经常结合distribute by来使用,其中利用distribute by对数据进行分类,然后再在每一个分类中对数据进行排序。

3. 如果distribute by和sort by的字段一致,那么可以写成cluster by。

4. 案例:

#原始数据

1 Max 69

1 Eric 70

1 Hank 95

1 Larry 82

2 Justin 74

2 Tim 79

2 Ken 81

2 Ivan 87

3 Nick 95

3 Leo 72

3 Mars 84

3 Reed 91

#建表语句

create table students(class int, name string, score int) row format delimited fields terminated by ' ';

#加载数据

load data local inpath '/home/hivedemo/students.txt' into table students;

#Hive底层会将SQL转化为MapReduce,如果不指定,则只有1个ReduceTask

#1个ReduceTask-> order by

insert overwrite local directory '/home/orderby1' row format delimited fields terminated by ' ' select * from students order by score desc;

#1个ReduceTask -> sort by

insert overwrite local directory '/home/sortby' row format delimited fields terminated by ' ' select * from students sort by score desc;

#在只有一个ReduceTask的前提下,order by和sort by的排序结果一致

#设置ReduceTask的数量

set mapred.reduce.tasks = 3;

#多个ReduceTask -> order by

insert overwrite local directory '/home/orderby2' row format delimited fields terminated by ' ' select * from students order by score desc;

#多个ReduceTask -> sort by

insert overwrite local directory '/home/sortby2' row format delimited fields terminated by ' ' select * from students sort by score desc;

#按班级来分别对学生的成绩排序

insert overwrite local directory '/home/distributeby' row format delimited fields terminated by ' ' select * from students distribute by class sort by score desc;

#如果distribute by和sort by的字段一致,那么可以替换为cluster by

insert overwrite local directory '/home/distributeby2' row format delimited fields terminated by ' ' select * from students distribute by score sort by score;

#等价于

insert overwrite local directory '/home/clusterby' row format delimited fields terminated by ' ' select * from students cluster by score;

三、beeline

1. 概述

1. beeline是Hive提供的一个远程连接工具,允许用户去远程连接指定节点上的Hive服务。

2. beeline底层实际上是利用了JDBC的方式来发起了连接。

3. 需要注意的是,beeline在连接过程中可能会收到Hadoop权限验证的阻拦,所以在启动beeline之前,还需要去更改Hadoop的一部分配置。

2. 步骤

1. 关闭Hadoop。

stop-dfs.sh

stop-yarn.sh

2. 关闭所有的Hive进程 -> RunJar进程。

3. 编辑Hadoop的配置文件。

vim /home/software/hadoop-3.1.3/etc/hadoop/core-site.xml

#添加如下配置

<property>

        <name>hadoop.proxyuser.root.hosts</name>

        <value>*</value>

</property>

<property>

        <name>hadoop.proxyuser.root.groups</name>

        <value>*</value>

</property>

4. 重新启动Hadoop。

start-all.sh

5. 启动Hive进程。

hive --service metastore &

hive --service hiveserver2 &

6. 启动beeline。

beeline -u jdbc:hive2://hadoop01:10000/demo -n root

四、文件格式

1. 概述

1. Hive中的数据最终会以文件的形式落地到HDFS上,因此Hive落地的文件存在不同的存储格式,其中最主要的存储格式有4种:textfile,sequencefile,orc和parquet。

2. textfile和sequencefile底层采用的是行存储方式,orc和parquet采用的是列存储方式。

3. 在Hive中,如果不指定,则默认采用的是textfile格式。

2. orc

1. orc格式是Hive0.11开始引入的一种存储格式,采取的列存储方式。

2. 在每一个orc格式文件中,包含1个多个Stripe,1个File Footer以及1个Postscript:

a. Stripe用于orc文件的数据存储数据。

Ⅰ. 默认情况下,Stripe和Block一样的。

Ⅱ. 每一个Stripe中包含3部分:Index Data,Row Data,Stripe Footer:

1. Index Data:用于记录索引,默认情况下,在Stripe中每一万条数据建立一个索引,索引记录这一行数据在各个列中的offset(偏移量)。

2. Row Data:存储数据。在添加数据的时候,往往是按行添加的。在获取到一行数据之后,会将这行数据的每一个字段拆分出来,拆分之后按照列的形式来进行存储。在存储的时候,可以给不同的列执行不同的编码形式,编码之后会将这一列封装成一个或者多个Stream来进行存储。因为同一个列的字段类型是一样的,所以可以针对每一个列采取更好的压缩机制。

3. Stripe Footer:存储每一个Stream的类型、长度等信息。

b. File Footer:用于记录每一个Stripe中存储的数据的行数等信息。

c. Postscript:记录文件是否进行了压缩以及压缩编码等信息,还记录了File Footer在文件中的起始位置。

3. 在读取orc文件的时候,首先通过Postscript来获取File Footer的位置,再通过File Footer来获取Stream的位置,最后来读取Stream中的数据。

五、基本架构

 

1. Client Interface:提供给用户用于操作Hive的接口,主要有3种:CLI(command-line interface,命令行接口),JDBC/ODBC(用Java代码操作Hive),WEBUI(WEB界面,通过浏览器页面来访问)。

2. Metastore:用于存储Hive的元数据的。如果不指定,Hive的元数据是维系在Derby。当操作Hive的时候,都会先访问Metastore来进行元数据的校验。

3. Driver:驱动器,包含了四个部分:

a. SQL Parser:SQL解析器,解析SQL语句,生成对应的抽象语法树AST。

b. Physical Plan:编译器,会将抽象语法树编译成要执行的逻辑计划。

c. Query Optimizer:优化器,会对逻辑计划进行优化。

d. Execution:将逻辑计划转化为物理计划,例如转化为MapReduce程序。

4. MapReduce:Execution产生程序之后,现阶段会交给MapReduce来执行。

5. HDFS:存储Hive中的数据。

六、优化

1. Fetch值修改

a. 在Hive中,可以通过hive.fetch.task.conversion属性来修改fetch的状态。在Hive3.X中,这个属性的默认值是more,在之前的版本中,这个属性的默认值是minimal。

b. 如果将这个属性的值改为none,那么Hive进行的所有的操作都会转为MapReduce程序,那么会导致部分操作的效率降低,例如select * from person;这个SQL是查询整表,实际上就是将文件从头到尾顺次读取,此时这个操作可以不适用MapReduce。

2. map side join

a. 开启之后,在大表和小表进行join的时候,会自动的将小表中的数据放到内存中,然后在处理大表数据的过程中,如果用到了小表中的数据,那么会自动的从内存中来读取小表的数据而不是再从磁盘上来读取,利用这种方式能够相对有效的提高执行效率。

b. 小表的大小可以通过属性hive.mapjion.smalltable.filesize来调节,默认值是25MB。

c. 可以通过hive.auto.convert.join属性来开启map side join,默认值是true。

d. 在Hive3.X之前,要求必须是小表join大表才会触发这个map side join;但是注意,从Hive3.X开始,不再要求小表的位置。

3. 启用严格模式

a. 将hive.strict.checks.no.partition.filter设置为true之后,要求在查询分区表的时候必须携带分区字段。

b. 将hive.strict.checks.orderby.no.limit设置为true之后,要求在对数据排序的时候必须添加limit字段。

c. 将hive.strict.checks.cartesian.product设置true之后,要求查询结果中不准出现笛卡尔积。

4. JVM重用

a. Hive会将SQL在底层转化为MapReduce来执行,MapReduce在执行的时候会拆分为MapTask和ReduceTask。NodeManager在执行任务的时候,会在本节点上来开启一个JVM子进程执行MapTask或者ReduceTask。默认情况下,每一个JVM子进程只执行一个子任务就会结束,所以如果存在多个子任务就需要开启和关闭多次JVM子进程。

b. 通过属性mapred.job.reuse.jvm.num.tasks来调节,默认为1。

 

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

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

相关文章

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下&#xff0c;跨国贸易越来越普遍&#xff0c;跨语言沟通也越来越频繁。小黄是一家跨国公司的员工&#xff0c;他梦想能在全球各地拓展自己的业务&#xff0c;奈何遇到了一个巨大的挑战&#xff1a;跨语言沟通。在这其中&#xff0c;pdf文件是他经常接收到的…

java基础总结

1.java静态变量&#xff0c;代码块&#xff0c;和静态方法执行顺序是什么 代码块分三种&#xff1a;static静态代码块&#xff0c;构造代码块&#xff0c;普通代码块 代码块执行顺序&#xff1a;静态代码块 -> 构造代码块 -> 构造函数 -> 普通代码块 继承中代码块执…

linux基本功系列之cd命令实战

文章目录 前言一. cd命令的介绍二. 语法格式及常用选项三. 参考案例总结 前言 居然发现了落下了CD命令&#xff0c;也不算落下把&#xff0c;主要是cd命令内容太少&#xff0c;撑不起一篇文章&#xff0c;今天也写一写&#xff0c;就当记个笔记吧 &#x1f3e0;个人主页&#…

阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法

阿里云百科有2台香港地域的轻量应用服务器&#xff0c;国内使用发现Ping值延迟丢包严重&#xff0c;从大陆到香港访问是经过国际链路和运营商国际路由节点&#xff0c;会受到到国际链路拥塞&#xff0c;以及运营商出境路由限制&#xff0c;导致无法正常连接或访问某些网站&…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了&#xff0c;今天突然使用的时候&#xff0c;发现用不了&#xff0c;报错&#xff1a; Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查&#xff0c;发现…

新人入职培训感悟

【新世界扬帆】校招新人训练营学习总结_刘珍珍 问题&#xff1a;帮我写一段关于新人入职培训后的感悟&#xff0c;内容需要包括回顾本次新人培训&#xff0c;我参与了哪些课程和活动的学习&#xff1f;在这些内容中&#xff0c;我觉得对我最有帮助的是哪些&#xff1f;这些内容…

使用docker部署node和react应用

使用docker部署node和react应用 Docker 使开发人员能够将所有应用程序打包到容器中。这些容器可以在任何安装了 Docker 的机器上运行&#xff0c;并且应用程序将是相同的。这是在多个系统上运行代码库克隆的好方法&#xff0c;并且我们可以确保它们都是相同的。 在本文中&…

设计模式八:桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式&#xff0c;用于将抽象与实现分离&#xff0c;使它们可以独立地变化。桥接模式的核心思想是将一个大类或多个紧密相关的类分为两个独立的层次结构&#xff0c;从而实现解耦。 在桥接模式中&#xff0c;存在两个维度的类/对象结构&#xff1a;抽象…

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Mac Navicat 16试用脚本

一、无限试用脚本如下 #!/bin/bash #/usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.navicat.NavicatPremium.plist /usr/libexec/PlistBuddy -c "Delete :91F6C435D172C8163E0689D3DAD3F3E9" ~/Library/Preferences/com.navicat.Navica…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 前提 要求…

高校陆续拥抱chatgpt,人工智能会给学术带来什么变化会有什么影响

在当今信息爆炸的时代&#xff0c;人工智能在各行各业都发挥着越来越重要的作用&#xff0c;高校教育领域也不例外。最近&#xff0c;越来越多的高校开始陆续拥抱chatgpt&#xff08;Chatbot GPT&#xff09;这一人工智能技术&#xff0c;在学术领域会带来了怎样的变化与影响&a…

【RabbitMQ(day3)】扇形交换机和主题交换机的应用

文章目录 第三种模型&#xff08;Publish/Subscribe 发布/订阅&#xff09;扇型&#xff08;funout&#xff09;交换机Public/Subscribe 模型绑定 第四、第五种模型&#xff08;Routing、Topics&#xff09;第四种模型&#xff08;Routing&#xff09;主题交换机&#xff08;To…

在线五子棋对战

目录 数据管理模块&#xff08;数据库设计&#xff09; 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块&#xff08;数据库设计&#xff09; 数据库中有可能存在很多张表&#xf…

已注销【888】

元神密码 - 飞书云文档 (feishu.cn)

微信小程序接入腾讯云天御验证码

腾讯云新一代行为验证码&#xff08;Captcha&#xff09;&#xff0c;基于十道安全防护策略&#xff0c;为网页、APP、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时&#xff0c;提供更精细化的用户体验。 …

DataSphere Studio- 1.1.1 安装部署(自动化脚本)

DSSLinkis Ansible一键安装脚本 DSS1.1.1 & Linkis 1.3.0 Ansible 一键部署脚本 作者&#xff1a;wubolive Q Q&#xff1a;1049635685 邮箱&#xff1a;wubolivefoxmai.com Github&#xff1a;https://github.com/wubolive/dss-linkis-ansible 一、简介 为解决繁琐…

flutter开发实战-时间显示刚刚几分钟前几小时前

flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳&#xff0c;需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…

消息疯狂堆积!RocketMQ出Bug了?

前言 用过 MQ 的同学&#xff0c;可能会遇到过消息堆积的问题。而肥壕最近也踩上了这个坑&#xff0c;但是发现结果竟然是这么一个意料之外的原因而导致的。 正文 那一晚月黑风高&#xff0c;肥壕正准备踏上回家的路&#xff0c;突然收到告警短信轰炸&#xff01;“MQ 消息堆…

微服务的基础使用

微服务 Maven的依赖冲突解决方案&#xff1a; 路径最短原则 配置优先原则 破坏规则则使用排除 SpringBoot场景启动器starter的开发流程 c3p0-spring-boot-starter自定义场景启动器 test-c3p0调用自定义场景启动器 SpringBoot自动装配 SpringBoot应用启动原理 nacos服务治…