当前位置:   article > 正文

hive split函数_Hive

java中执行hive命令 split

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. 权限管理:

aa74892c5565987fd65c7c93c6910e0c.png

9712dd20ae1505493749f3f4afe8c61c.png

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插槽资源!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/656412
推荐阅读
相关标签
  

闽ICP备14008679号