`

hive

 
阅读更多

第一:Hive和关系型数据库的区别
1.Hive将外部的任务解析成一个MapReduce可执行计划,而启动MapReduce是一个高延迟的一件事,每次提交任务和执行任务都需要消耗很多时间,这也就决定Hive只能处理一些高延迟的应用(如果你想处理低延迟的应用,你可以去考虑一下Hbase)。即:hive不能像传统数据库那样完成实时交互式查询。
2.Hive目前还不支持事务;不能对表数据进行修改(不能更新、删除、插入;只能通过文件追加数据、重新导入数据);
3.不能对列建立索引(但是Hive支持索引的建立,但是不能提高Hive的查询速度。如果你想提高Hive的查询速度,请学习Hive的分区、桶的应用)。
4.hive将元数据存在关系型数据库中,其数据存储在hdfs中。

第二:hive的概念
1.hive是数据仓库,将元数据存储在关系型数据库中,例如mysql、oracle。hive中的元数据包括表的名字、表的列、分区及其属性、表的属性(是否为外部表等)。
元数据存在metastore中。metastore是服务器,mysql是客户端, 客户端通过服务器 matastore server去请求mysql数据库
2.hive中的数据存储在hdfs中,大部分查询和计算由mapreduce来完成(因此不会是实时的查询,因为mr计算比较慢)
3.hive是类似sql的hql语句,主要用于查询分析,生成的查询计划存储在hdfs中,并在随后由mapreduce调用执行。
4.hive是解释器、编译器、优化器
5.编译器将一个hivesql转化成操作符,操作符是hive中最小的处理单元,每个操作符一个hdfs操作或者一个mapreduce操作。这些操作
例如select * from table是一个hdfs操作。select count(1) from table 是一个mapreduce操作。
6、客户端如何访问hive:①hive cli命令行接口(--hive黑窗口)②jdbc查询(启动hiveserver2)③webui
7.单用户模式:只能启动一个--hive
8.为啥会有多个用户:因为多个用户对元数据的存储和管理不同。
9、由于我们使用了mysql当客户端,因此hive创建的表会在mysql客户端中找到。在导入数据的时候要先找到指定目录(/user/hive/warehouse),
这个目录是我们在配置hive的时候配置好的。然后把此目录下的文件数据加载到mysql中。

第三:sql语句
1.内部表的创建并添加数据
(1)在hive命令行窗口中创建表,创建好之后这个表就存在mysql中了,如果没指定具体哪个数据库,那肯定是默认数据库default。
查看表的详细信息可以看到数据的存放目录:hdfs://mycluster/user/hive/warehouse/psn0,其中/user/hive/warehouse是我们自己在配置文件中配置的。
create table psn0 (
id int,
name string,
likes ARRAY<string>,
address MAP<string, string>
) ROW FORMAT DELIMITED ---这是说明定义列是如何分割的(定义读写规则)。
FIELDS TERMINATED BY ',' -----列之间
COLLECTION ITEMS TERMINATED BY '-' -----集合(包括数组和map)元素之间
MAP KEYS TERMINATED BY ':';------map的key之间
(2).添加(加载)数据:准备一些测试数据,使用vim产生data1文件随便存放在虚拟机中的root目录下。
数据在本地:LOAD DATA LOCAL INPATH '/root/data1' INTO TABLE psn0;--(数据文件在本地虚拟机上,数据从本地拷贝到hdfs中的/user/hive/warehouse目录下)
数据在hdfs中:LOAD DATA INPATH '/data1' INTO TABLE psn0;--(文件直接移动到hdfs中的/user/hive/warehouse路径下。相当于剪切)
insert ino value的形式,我们一般不用了,用load。

2.外部表
(1),创建表。指定表中数据的存放目录:hdfs://mycluster/psn1
create EXTERNAL table psn1 (
id int,
name string,
likes ARRAY<string>,
address MAP<string, string>
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LOCATION '/psn1';---表的存放目录为hdfs中的psn1。(由于是外部表,因为需要自己指定要存到hdfs中的哪个目录中,元数据的存放位置)
LOAD DATA LOCAL INPATH '/root/data1' INTO TABLE psn1;---把/root/data1的数据导入到表psn1中,然后指定了数据仓库在/psn1路径下


3.内部表和外部表的区别:
当我们drop删除表的时候:外部表删除的时候只是把metastore的元数据删除,不删除hdfs中的表数据(只相当于一个连接、引用)(数据还在hdfs中的hdfs://mycluster/psn1下)。
内部表删除表时,元数据与数据都会被删除。
注意:内部表是hive自身管理(配置文件中配置好了),所以都删除了。外部表只是相当于一个引用。


第四:分区(分区字段不在表中存在)
1.创建分区表
create table psn2 (
id int,
name string,
likes ARRAY<string>,
address MAP<string, string>
)
PARTITIONED BY (sex string) ---分区
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';

2.往分区表中导入数据
LOAD DATA LOCAL INPATH '/root/data1' INTO TABLE psn2 partition (sex='man');---把本地root/data1路径下面的sex='man'的数据导入数据库。其实就是导入文件中的部分内容。
LOAD DATA INPATH '/root/data2' INTO TABLE psn2 partition (sex='gril');--把hdfs中的/root/data2目录下的文件移动到hdfs中配置文件配置的指定路径下后将数据保存到mysql数据库中的psn2表中。

3.查询psn2表
select *  from psn2 where sex='max':此时查询不会全表扫描了,只会扫描指定分区的数据了。
即:不会扫描hdfs://mycluster/user/hive/warehouse/psn2路径,而只会把扫描hdfs://mycluster/user/hive/warehouse/psn2/max目录。

4.添加和删除分区
ALTER TABLE psn5 ADDPARTITION (sex='man', age=1);---注意:后面要跟所有的分区字段
select *  from psn2 where (sex='man', age=1)---查询的时候,后面也要跟所有的分区字段
ALTER TABLE psn5 DROP PARTITION (age=1);---注意:后面可以不跟所有字段。反正最终就是把age=1的所有数据都删除(可能来自不同的分区)

 

第五:like、as、insert select from、insert
1.create table psn4 like psn2;----相当于复制表结构,但是无数据。
2.CREATE TABLE tbl1--创建tbl1表,同时将表psn2的查询结果存到表tbl1
   AS
SELECT id, name , likes
FROM psn2;

3.我们在hive中的查询结果,都只是在控制台中的,现在这个写法直接把查询结果保存到了结果表中了,其核心还是存在了hdfs中了。
如果要找具体目录:hdfs://mycluster/user/hive/warehouse/page_view1。有了这个目录,我们就可以把数据导入到关系型数据库了。
FROM page_view_stg pvs--不用创建表,给表page_view_stg 中的结果存到page_view1表中
INSERT OVERWRITE TABLE page_view1
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt
INSERT OVERWRITE TABLE page_view1
       SELECT pvs.viewTime, pvs.userid, pvs.page_url;

3.2
INSERT OVERWRITE TABLE page_view1
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt
FROM page_view_stg pvs

4.insert into table tab0 values(id,name)


第六:函数
1、自定义函数包括三种UDF、UDAF、UDTF
2.UDF(User-Defined-Function):用户自定义函数, 一进一出,如trim
3.UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出,如count,max等
4.UDTF(User-Defined Table-Generating Functions)&#160; 一进多出,一可以是一个数组什么的,就一个函数:explode。如 explode(enjobs)。
explode是将数组一条记录中有多个参数,将参数拆分,每个参数生成一列。例如“爱好”
5.用户自定义函数,即自定义udf函数
6.
显示所有表:show tables
显示表信息(备注等):desc 表名
显示表信息(更详细):desc formatted 表名
新增数据:insert into tbl values(1,'xiaoming');
创建表:hive> create table tbl(id int,name string);
查询具体信息:Detailed Table Information


总结:我们使用hive主要是用于分析。用它替代mapreduce,那么我们就能用sql语句执行复杂业务了。
①那么hive为什么能替代mapreduce呢?
因为hive会将sql语句转化成mapreduce进行计算。
mapreudce计算的时候会去hdfs中找数据,而hive的数据也是存在hsfs中(元数据存在mysql中了,也可以将元数据存在oracle等)
②hive是数据仓库
因为hive不能像数据库那样实时交互式查询,他转成mapreduce是有延时的。

 

第七:动态分区
1.动态分区:静态分区在导入表的时候(写load),一个load只能按照后面的条件导入符合条件(分区字段和分区值)的数据。但是如果按年龄分区,load只能导入一点点数据,为了能够导入所有数据,引入了动态分区。它自动把文件中的数据
按照创建表时候建立的分区,划分到不同的分区。
注意:load方式要写具体的值partition(sex="man"),因此无法作为动态分区。因此动态分区要使用下面的方式:先把数据导入到普通的表
中,然后在把insert的形式添加到分区表中,insert不用指定分区值。
create table psn20 (---第一步创建普通表(临时表)
id int,
name string,
sex string,
age int,
likes ARRAY<string>,
address MAP<string, string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';

LOAD DATA LOCAL INPATH '/root/data3' INTO TABLE psn20;---第二步把文件内容导入到普通表中
create table psn21 (-----第三步创建分区表(正式表,真正要的表)
id int,
name string,
likes ARRAY<string>,
address MAP<string, string>
)
PARTITIONED BY (sex string, age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';

from psn20----第四步:把临时表中的数据导入到正式表中。此时配置文件的目录下有了所有的分区。并且psn21表中也包含了所有数据。
insert overwrite table psn21 partition(sex, age) 
select id, name, likes, address, sex, age distribute by sex, age;


2.动态分区思路:由于load是文件拷贝,所以load形式肯定又会是静态分区了,
产生了分区目录了。所以使用insert的形式完成。
先创建一个没有分区的普通表(带着第二张表的分区字段),然后第二张分区表用from insert。
这样的结果就是一个sql把所有数据都完成了,而且也都进行分区了。


第八:分桶
分桶:分区是产生多个目录,分桶是产生多个文件。先有分区后有分桶,分桶是分区的细化。
对于hive中每一个表、分区都可以进一步进行分桶,由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中

分区是便于查询,分桶是为了数据抽样(把数据分成好多小文件打散了,之后随机抽取),
分桶还可以做join连接,提高查询效率(笛卡尔积,避免全表扫描)。
举例:A表和B表两个表用id做关联,即A.id join b.id,这样需要全表扫描。现在这两个表都用id做分桶(假设A表和B表都分成了1号桶、2号桶、3号桶)。做了分桶之后的效果就是A表中的1号桶的数据去关联B表中1号桶的数据,不用关联整个B表。A表中的2号桶的数据关联B表中2号桶的数据。

下面是x与y的使用方法:
x表示从哪个bucket桶开始抽取数据
y必须为该表总bucket桶数的倍数或者因子
现在假设桶的个数是32,x=3,y=8,那么32/8=4,说明我们要从3号桶开始取四个桶的数据。
即3,3+8,3+8+8,3+8+8+8,也就是取第3号、第11号、第19号、第27号桶的个数

 

第九:lateral view来解决udtf的缺点(udtf只能对一列查询)
lateral view的引入:解决udtf函数的缺点。explode类型的查询只能查询一个字段(因为这个字段在查询出结果的时候会产生多个列),为了能select后面能查询多个列,因此引入lateral view。
lateral  view语法如下:
select explode(likes),id from psn20----这样会报错,因为explode(likes)是一个拆分(一对多),查询的时候只能查询这一个。
正确做法:统计人员表中共有多少种爱好、多少个城市(其实就是起个别名):
select count(distinct(myCol1)), count(distinct(myCol2)) from psn2
LATERAL VIEW explode(likes) myTable1 AS myCol1
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;

 

第十:view试图和索引:
创建索引后会在table表中生成一个新索引表,此表中无数据。需要重建索引才能生效(生效的时候会转成mapreduce进行产生数据),生效之后里面就有数据了,包括索引名,分区名,桶名,偏移量。
如果table表中又新增了数据,那么又得生效一次。
查看这个表中的索引:show index on 表名
2.创建索引
2.1:create index t1_index on table psn2(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild
in table t1_index_table;
(as:指定索引器;in table:指定索引表,若不指定默认生成在default__psn2_t1_index__表中)

2.2:create index t1_index on table psn2(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild;

2.3:创建好索引后,会产生索引表,索引表中的列包括索引名称、桶的名称、偏移量、分区名称,但是索引表中无数据。
如果想要索引表中有数据,那么就要重建索引。索引也是需要资源的。
重建索引:ALTER INDEX t1_index ON psn2 REBUILD
查询索引:show index on psn2
删除索引:DROP INDEX IF EXISTS t1_index ON psn2;


第十一:hive的运行方式与权限控制。
1.Hive运行方式:
命令行方式cli:控制台模式
脚本运行方式(实际生产环境中用最多)
JDBC方式:hiveserver2
web GUI接口 (hwi、hue等)
2.权限:过

第十二:hive优化
1.核心思想:把Hive SQL 当做Mapreduce程序去优化
2.select *  from tab  where id=1 不会转化为mapreduce
3.显示sql执行计划:explain select *  from tab ,可以通过执行计划进行分析。
4.优化1:设置运行方式:测试在本地(数据量小),生产在集群中。开启本地方式:set hive.exec.mode.local.auto=true;
5,优化2:并行计算:最好在集群性能负载不是很高的时候开启。
通过设置以下参数开启并行模式:set hive.exec.parallel=true
一次SQL计算中允许并行执行的job个数的最大值:hive.exec.parallel.thread.number
6.优化3:开启严格模式:set hive.mapred.mode=strict。
默认是非严格模式,严格模式会限制下面的内容:
(1)、对于分区表,必须添加where对于分区字段的条件过滤;
(2)、order by语句必须包含limit输出限制;
(3)、限制执行笛卡尔积的查询。
7.优化4:排序
Order By - 对于查询结果做全排序,只允许有一个reduce处理
(当数据量较大时,应慎用。严格模式下,必须结合limit来使用)
Sort By - 对于单个reduce的数据进行排序
Distribute By - 分区排序,经常和Sort By结合使用

8.优化5:join
(1).将小表放在左边
(2).尽量在map端进行join
自动的mapjoin
通过修改以下配置启用自动的mapjoin:
set hive.auto.convert.join = true;
(该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map join)

相关配置参数:
hive.mapjoin.smalltable.filesize; 
(大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行)
hive.ignore.mapjoin.hint;
(默认值:true;是否忽略mapjoin hint 即mapjoin标记)
hive.auto.convert.join.noconditionaltask;
(默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin)
hive.auto.convert.join.noconditionaltask.size;
(将多个mapjoin转化为一个mapjoin时,其表的最大值)


9、优化6:map端聚合
通过设置以下参数开启在Map端的聚合:
set hive.map.aggr=true;

相关配置参数:
hive.groupby.mapaggr.checkinterval:
map端group by执行聚合时处理的多少行数据(默认:100000)
hive.map.aggr.hash.min.reduction:
进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置0.5,则不会聚合)
hive.map.aggr.hash.percentmemory:
map端聚合使用的内存的最大值
hive.map.aggr.hash.force.flush.memory.threshold:
map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush
hive.groupby.skewindata
是否对GroupBy产生的数据倾斜做优化,默认为false


10.优化7:控制Hive中Map以及Reduce的数量(用set命令就修改了)
Map数量相关的参数
mapred.max.split.size
一个split的最大值,即每个map处理文件的最大值
mapred.min.split.size.per.node
一个节点上split的最小值
mapred.min.split.size.per.rack
一个机架上split的最小值

Reduce数量相关的参数
mapred.reduce.tasks
强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer
每个reduce任务处理的数据量
hive.exec.reducers.max
每个任务最大的reduce数

11.优化8:JVM重用
适用场景:(1)、小文件个数过多。(2)、task个数过多。
task过多,就会导致每次 执行task的时候都会申请资源、释放资源。
通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置卡槽个数。
缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Hive3.1.2编译源码

    使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...

    《Hive数据仓库案例教程》教学课件 第5章 Hive数据操作.pdf

    《Hive数据仓库案例教程》教学课件 第5章 Hive数据操作.pdf《Hive数据仓库案例教程》教学课件 第5章 Hive数据操作.pdf《Hive数据仓库案例教程》教学课件 第5章 Hive数据操作.pdf《Hive数据仓库案例教程》教学课件 第...

    hive-3.1.1安装包

    Hive是一个基于Hadoop的数据仓库工具,它本身并不存储数据,部署在Hadoop集群上,数据是存储在HDFS上的. Hive所建的表在HDFS上对应的是一个文件夹,表的内容对应的是一个文件。它不仅可以存储大量的数据而且可以对...

    hive学习总结 思维导图.xmind

    由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文将从多个方面来阐述 Hive ...

    利用Hive进行复杂用户行为大数据分析及优化案例

    利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件+代码+讲义+工具软件),具体内容包括: 01_自动批量加载数据到hive 02_Hive表批量加载数据的脚本实现(一) 03_Hive表批量加载数据的脚本实现(二) ...

    HIVE-SQL开发规范.docx

    hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询...

    Hive使用手册Hive使用手册

    1 Hive 概念与连接使用: 2 2 Hive支持的数据类型: 2 2.1原子数据类型: 2 2.2复杂数据类型: 2 2.3 Hive类型转换: 3 3 Hive创建/删除数据库 3 3.1创建数据库: 3 3.2 删除数据库: 3 4 Hive 表相关语句 3 4.1 Hive ...

    Hive新手学习资料之Hive入门与实战.+Hive用户手册+hive函数大全中文版资源合集

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储...

    hivesql语句练习

    5.安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下 如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行) mysql -uroot -p #(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址...

    Hive数据仓库之垃圾分类数据分析系统

    (2)hive数据仓库分层设计,包含ODS、DWD、ADS层 (3)sqoop数据迁移,完成HIve与MySQL数据库中的数据交互 (4)Echarts搭建动态可视化大屏 (5)SpringBoot搭建可视化后台系统,完成前端与后台的数据传递与交互。 ...

    大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK......

    大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK.......

    hive-java开发驱动包

    hive java开发驱动包列表hive-common-2.3.4.jarhive-exec-2.3.4.jarhive-jdbc-2.3.4.jarhive-llap-client-2.3.4.jarhive-llap-common-2.3.4.jarhive-llap-server-2.3.4.jarhive-llap-tez-2.3.4.jarhive-metastore-...

    Hive-2.1.1-CDH-3.6.1 相关JDBC连接驱动 Jar 包集合

    02、hive-exec-2.1.1-cdh6.3.1.jar 03、hive-jdbc-2.1.1-cdh6.3.1.jar 04、hive-jdbc-2.1.1-cdh6.3.1-standalone.jar 05、hive-metastore-2.1.1-cdh6.3.1.jar 06、hive-service-2.1.1-cdh6.3.1.jar 07、libfb303-...

    flink-connector-hive-2.11-1.12.7-API文档-中文版.zip

    赠送jar包:flink-connector-hive_2.11-1.12.7.jar; 赠送原API文档:flink-connector-hive_2.11-1.12.7-javadoc.jar; 赠送源代码:flink-connector-hive_2.11-1.12.7-sources.jar; 赠送Maven依赖信息文件:flink-...

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hive表生成工具,Hive表生成工具Hive表生成工具

    apache-hive-2.1.1-bin.tar

    apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-...

    DataX数据的迁移(MySQL、HDFS,Hive)

    1.将Mysql中的数据迁移到Hdfs文件系统中,然后通过Hive加载HDFS文件系统中的数据值 2.将Hive中的数据迁移到指定Mysql数据库中 注意点: 1.数据迁移的过程中,由于hive的Null值存储为"\N",Mysql存储为NULL值,二者...

    hadoop+hive+mapreduce的java例子

    基于hadoop的Hive数据仓库JavaAPI简单调用的实例,关于Hive的简介在此不赘述。hive提供了三种用户接口:CLI,JDBC/ODBC和 WebUI CLI,即Shell命令行 JDBC/ODBC 是 Hive 的Java,与使用传统数据库JDBC的方式类似 Web...

Global site tag (gtag.js) - Google Analytics