赞
踩
Hive是非java编程者对hdfs的数据做MapReduce操作.Hive是基于hadoop的一个数据仓库.写sql语句,通过解释器编译器优化器生成一个查询计划,再在mapreduce执行.(将Hql->抽象语法树->查询块->逻辑查询计划->物理计划->最佳).
数据仓库:存的一般是历史数据并且数据量庞大,用来做查询分析的数据库,基本不用来做修改删除操作.可以打破各个模块的数据孤岛,将数据整合在一起.
1.Hive的DDL操作:
1. 建表:create table tablename(id int,name string) row format delimited fields terminated by ‘,’
COLLECTION ITEMS TERMINATED BY ‘-’
Map keys terminated by ‘:’
Lines terminated by ‘n’;
表分内表和外表,内表:hive既管理元数据,也管理源数据,在删除表的时候两钟数据一起删除,外表:hive只管理元数据,删除表的时候,只删除元数据(create external table person2)
2. 删除表:drop table tablename;
3. 修改数据库:alter table tablename rename to new_tablename;
2. 数据存储格式:textfile,sequencefile,rcfile,orc,jsonfile, parquet/avro
3. DML:几种数据的加载方式:
单条:insert into table values();
加载表:load data local inpath ‘path’ into table tablename;
插入数据:insert into table tablename select * from tablename;
插入多次数据:from tbalename1
Insert into table tablename2 select name,id
Insert into table tablename3 select name,id
将sql的执行结果,保存到本地目录下:
insert overwrite local directory '/opt/sxt/psn2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
select * from psn2;
将sql的执行结果,保存到hdfs下:
insert overwrite directory '/opt/sxt/psn2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
select * from psn2;
4. Hive的分区:
静态分区--上传数据,直接给这份数据,打上分区值.
动态分区--①建立临时表,②将临时表的数据通过MR任务,自动分拣出分区.
分区的作用:便于管理数据,分析数据时可以通过分区的字段,快速过滤数据.
创建单分区:
create table day_table(id int, content string)
partitioned by (dt string) row format delimited fields terminated by ',';
加载数据到分区表里:
load data local inpath '/opt/sxt/psn2/p1.txt' into table day_table partition(dt ='2019-05-28');
创建多分区:
create table ymd_table(id int, content string)
partitioned by (year int,month int ,day int) row format delimited fields terminated by ',';
加载多分区的数据:
load data local inpath '/opt/sxt/psn2/p1.txt' into table ymd_table partition(year=2018,month=04,day=28);
手动创建分区:
ALTER TABLE day_table ADD PARTITION (dt='2008-08-08')
注意:如果手动创建hdfs上的分区目录,则识别不了这个分区里的数据,因为hive少了分区元数据。需要手动创建分区
修改分区名称:
alter table day_table partition(dt='2008-08-08') rename to partition(dt='2009-08-09');
动态分区:
先创建临时表:
create table mid_psn(id int,name string,age int,address string)
row format delimited fields terminated by ',';
创建一个动态分区表:
create table psn5(id int, name string,age int)
partitioned by (address string) row format delimited fields terminated by ',';
将临时表的数据,通过分拣,动态的加载到分区表里面
将严格模式改为非严格模式:
set hive.exec.dynamic.partition.mode=nonstrict
from mid_psn
insert overwrite table psn5 partition(address)
select id,name,age,address distribute by address;
5. Hive函数:
内置函数:常见的数学函数,日期函数,字符函数,(聚合函数)[sum,count,max,min],(一对多函数)[explode].
自定义函数:自己写java程序.
1.将jar包上传到hive中: add jar
2.创建临时函数:有udf/udaf/udtf
CREATE TEMPORARY FUNCTION tuomin AS 'com.shsxt.demo.hive.TuoMin';
6. 分桶:适用于数据抽样,map-join,能够快速的筛选出数据
开启支持分桶:set hive.enforce.bucketing=true;
1.创建临时表:
CREATE TABLE psn10( id INT, name STRING, age INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
2.上传数据进去
Load data local inpath ‘path’ into table tablename
3.创建分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
4.加载数据到分桶表
insert into table psnbucket select id, name, age from psn10;
7. 远程服务:
①metastore :可以基于metastore元数据存储的控制,这种控制粒度比较粗,表级别.启动方式:hive--service metastore
②hiveserver2:基于sql权限标准模型,可以控制的粒度更细,使用JDBC要用这种服务.
启动服务:hiveserver2---
连接:beeline jdbc:hive2://node01:10000/default root 123
8. Hive几种参数配置:
①hiveconf,配置hive-site.xml
②set
③hive --hiveconf key = value
④/home/.hiverc
9. 运行方式:
1:CLi客户端交互
2:JDBC
3:wei ui---hwi服务
4:脚本运行方式----hive -e ‘sql’
hive -S -e ‘sql’ >aaa
Hive -f file
与hdfs交互 dfs +命令
与linux交互 !+命令
10. Hive Lateral View:
用于和UDF函数(explode,split)结合使用
首先通过UDF函数拆分成多行,再将多行结果,组合成一个支持别名的虚拟表,主要解决在select使用UDTF做查询过程中,查询只能包含一各UDTF,不能包含其他字段,以及多个UDTF的问题
select count(distinct(myCol1)), count(distinct(myCol3)) from psn
LATERAL VIEW explode(likes) myTable1 AS myCol1
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;
11. Hive索引:
创建索引:
create index t1_index on table psn(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild
in table t1_index_table;
重建索引(生效)
ALTER INDEX t1_index ON psn REBUILD;
12. 权限管理:
Hive性能优化:
1. 把hive sql当做mapreduce程序去优化.(explain显示执行计划.)
2. Hive运行方式:①本地模式②集群模式(set hive.exec.mode.local.auto=true;)(hive.exec.mode.local.auto.inputbytes.max默认值128M)
3. 并行计算:Select t1.cf1,t2.cf2 from
(select count(id) as cf1 from psn) t1,
(select count(id) as cf2 from psn) t2;
4. 严格模式:通过设置参数开启严格模式
Set hive.mapred.mode=strict;
查询限制:
1. 对于分区表,必须添加where对于分区字段的条件过滤
2. Order by语句必须包含limit输出限制
3. 限制执行笛卡尔积的查询
5.Map-Side聚合
通过设置以下参数开启在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
其实聚合就是压缩,就是mapreduce的combiner.
6.控制Hive中Map以及Reduce的数量
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数
7.Hive - JVM重用
适用场景:
1、小文件个数过多
2、task个数过多
通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置
(n为task插槽个数)
缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。