0
点赞
收藏
分享

微信扫一扫

大数据笔记--Hive(第四篇)

骨灰级搬砖工 2022-03-20 阅读 67

目录

一、join

1、概述

2、案例

二、查询和排序

1、having

2、排序

三、beeline

1、概述

2、步骤

四、文件格式

1、概述

2、orc

五、基本架构

六、优化

1、Fetch值修改

2、map side join

3、启用严格模式

4、JVM重用


一、join

1、概述

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

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

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

下图是mysql的join图解,供参考:

2、案例

首先我们在hdfs上创建两个目录orders和products

 然后将我们本地创建两个txt文件,分别上传到hdfs上 

 建表语句:

左连接-以左表为准:

右连接-以右表为准:

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

 全外连接:

 笛卡尔积:

二、查询和排序

1、having

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

案例:

2、排序

①、在Hive中,提供了2种排序方式

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

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

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

③、如果distribute by和sort by的字段一致,那么可以写成cluster by

④、案例

三、beeline

1、概述

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

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

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

2、步骤

①、关闭Hadoop

②、关闭所有的Hive进程RunJar

③、编辑Hadoop的配置文件

④、重新启动hadoop与Hive

⑤、启动beeline

四、文件格式

1、概述

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

textfilesequencefile底层采用的是行存储方式,orcparquet采用的是列存储方式

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

2、orc

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

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

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

注意:建表的时候在后面加上 stored as orc 就可以设置orc格式了。

五、基本架构

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

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

③、Driver:驱动器,包含了四个部分

④、MapReduce:Execution产生程序之后,现阶段会交给MapReduce来执行

⑤、HDFS:存储Hive中的数据

六、优化

1、Fetch值修改

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

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

2、map side join

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

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

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

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

3、启用严格模式

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

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

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

4、JVM重用

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

②、通过属性mapred.job.reuse.jvm.num.tasks来调节,默认为1,一般来说我们调节到9或10

举报

相关推荐

0 条评论