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

news2024/9/25 11:20:12

文章作者邮箱: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.coloradmin.cn/o/833126.html

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

相关文章

一个对象的内存图,两个对象使用同一个方法的内存图

一个对象的内存图 public class Phone {String brand; //品牌double price; //价格String color; //颜色public void call(String who) {System.out.println("给" who "打电话");}public void sendMessage() {System.out.println("群发短信");…

【第一阶段】kotlin的range表达式

range:范围&#xff1a;从哪里到哪里的意思 in:表示在 !in&#xff1a;表示不在 … :表示range表达式 代码示例&#xff1a; fun main() {var num:Int20if(num in 0..9){println("差劲")}else if(num in 10..59){println("不及格")}else if(num in 60..89…

2023年自动化测试已成为标配?一篇彻底打通自动化测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先我们从招聘岗…

CompletableFuture原理与实践

文章目录 1 为何需要并行加载2 并行加载的实现方式2.1 同步模型2.2 NIO异步模型2.3 为什么会选择CompletableFuture&#xff1f; 3 CompletableFuture使用与原理3.1 CompletableFuture的背景和定义3.1.1 CompletableFuture解决的问题3.1.2 CompletableFuture的定义 3.2 Complet…

Shell脚本学习-for循环结构1

for循环语句主要用于执行次数有限的循环&#xff0c;而不是用于守护进程和无限循环。 语法结构&#xff1a; for 变量名 in 变量取值列表 do指令... done 提示&#xff1a;in 变量值列表 可以省略&#xff0c;省略就相当于 in "$"&#xff0c;也就是使用for i in &…

企业大数据可视化案例专题分享-入门

一、什么是数据可视化&#xff1f; 基本概念&#xff1a;数据可视化是以图示或图形格式表示的数据。让决策者可以看到以直观方式呈现的分析&#xff0c;以便他们可以掌握困难的概念或识别新的模式。借助交互式可视化&#xff0c;可以使用技术深入挖掘图表和图形以获取更多详细…

Java版工程项目管理系统平台+企业工程系统源码+助力工程企业实现数字化管理 em

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程…

IO进程线程第六天(8.3)线程,线程函数+XMind

创建两个线程&#xff1a;其中一个线程拷贝前半部分&#xff0c;另一个线程拷贝后半部分。 只允许开一份资源&#xff0c;且用互斥锁方式实现。 #include<stdio.h> #include<head.h> #include<pthread.h> struct file {int fp; int fq; off_t size; }; pth…

什么?你还没有用过JPA Buddy,那么你工作肯定没5年

1. 概述 JPA Buddy是一个广泛使用的IntelliJ IDEA插件&#xff0c;面向使用JPA数据模型和相关技术&#xff08;如Spring DataJPA&#xff0c;DB版本控制工具&#xff08;Flyway&#xff0c;Liquibase&#xff09;&#xff0c;MapStruct等&#xff09;的新手和有经验的开发人员…

投资圈爆火的文心杯创业大赛,大模型三大趋势值得关注!

“百模大战”打响&#xff0c;掀起大模型领域“创业热潮”。今年5月31日&#xff0c;百度启动“文心杯”创业大赛&#xff08;后简称“大赛”&#xff09;&#xff0c;不到1个月报名时间&#xff0c;吸引近1000个项目激烈角逐&#xff0c;在知名投资人和AI专家的权威评审和层层…

8 网络通信(下)

文章目录 wireshark 抓包工具的快速入门TCP/IP 协议详解TCP/IP 协议概述部分协议补充 OSI 参考模型及 TCP/IP 参考模型以太网帧格式ARP 数据报格式IP 段格式ICMP 协议TCP协议UDP 协议MTU和MSS补充 产品模式【C/S B/S】C/S 模式B/S 模式 DDOS简单介绍&#xff08;SYN Flooding&a…

【暑期每日一练】 day13

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一…

Spring Cloud Feign+Ribbon的超时机制

在一个项目中&#xff08;数据产品&#xff09;&#xff0c;需要对接企业微信中第三方应用。在使用 Feign 的去调用微服务的用户模块用微信的 code 获取 access_token 以及用户工厂信息时出现 Feign 重试超时报错的情况&#xff0c;通过此篇文章记录问题解决的过程。 一、问题重…

探究Vue源码:mustache模板引擎(9) 将单层无喜欢结果tokens转为dom字符串

好 我们前面几篇文章 已经编写完了 将dom结构的模板字符串转为 tokens 数据结构的代码 那么 现在 我们就需要用tokens 结合数据 去生成dom字符串 我们先来研究一下我们的模板字符串与数据结构 首先 数据从这个data中去拿 然后 模板字符串语句中 先是 利用对象中的students 循环…

redis五种数据类型介绍

、string&#xff08;字符串&#xff09; 它师最基本的类型&#xff0c;可以理解为Memcached一模一样的类型&#xff0c;一个key对应一个value。 注意&#xff1a;一个键最大能存储 512MB。 特性&#xff1a;可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…

【动态规划算法】-回文串问题题型(34-40题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

动态规划笔记(一)

动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是求解决策过程最优化的过程&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题&#xff0c;在数学、管理科学、计算机科学、经济学和生物信息学等领域被广泛使用。 它的基本思想非常简单&…

SpringBoot整合Caffeine

一、Caffeine介绍 1、缓存介绍 缓存(Cache)在代码世界中无处不在。从底层的CPU多级缓存&#xff0c;到客户端的页面缓存&#xff0c;处处都存在着缓存的身影。缓存从本质上来说&#xff0c;是一种空间换时间的手段&#xff0c;通过对数据进行一定的空间安排&#xff0c;使得下…

java:解决报错非法字符: ‘\ufeff‘以及什么是BOM

背景 运行 JAVA 项目后&#xff0c;报错提示&#xff1a;非法字符: \ufeff&#xff0c;如图&#xff1a; 但是我在这个报错的文件中并没有搜到这个字符&#xff0c;那到底是什么原因 什么是BOM BOM&#xff08;Byte Order Mark&#xff09;&#xff0c;隐藏字符&#xff0c…

5、二叉树

二叉树遍历 递归序 public static void f(Node head) {if (head == null) {return;}f(head.left);f(head.right); }前中后遍历_递归 public static void preOrderRecur(Node head) {if (head == null) {return;}System.out.print(head.value + " ");preOrderRecur…