文章目录
Hive分区
1.简介
Hive分区的概念与传统关系型数据库分区不一样。
传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区。
Hive的分区方式:因为Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。
因此能够这样理解,当在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。
为什么要分区
1、在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
2、分区表指的是在创建表时指定的partition的分区空间。
3、如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by。
如何分区以及细节
根据业务分区,(完全看业务场景)选取id、年、月、日、男女性别、年龄段 或者是能平均将数据分到不同文件中最好,分区不好将直接导致查询结果延迟。
分区细节:
一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下;
表和列名不区分大小写;
分区是以字段的形式在表结构中存在,但是该字段不存放实际的数据内容,仅仅是分区的表示;
分区有一级、二级设置一般设置为一级分区;
分区分为动态分区和静态分区。
2.Hive分区的建立
Hive分区是在建立表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,可是Hive下的数据文件中并不包含这些列,由于它们是目录名。
创建分区
CREATE TABLE `udata_partition`(
`user_id` string,
`item_id` string,
`rating` int)
PARTITIONED BY (`dt` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
静态分区
每个分区要写一个load data,缺点:load data 效率低下,非常繁琐,不常用静态分区在业务中
建立一张静态分区表par_tab,单个分区
create table par_tab (name string,nation string) partitioned by (sex string) row format delimited fields terminated by ',';
把数据插入到表(其实load操做至关于把文件移动到HDFS的Hive目录下)
loaddatalocal inpath '/home/hadoop/files/par_tab.txt'intotable par_tab partition(sex='man');
能够看到,在新建分区表的时候,系统会在hive数据仓库下建立一个目录,再建立目录的子目录sex=man(分区名),最后在分区名下存放实际的数据文件。
新建表的时候设置多分区,定义的分区顺序,决定了文件目录顺序(谁是父目录谁是子目录)
动态分区
若是用上述的静态分区,插入的时候必须首先要知道有什么分区类型,并且每一个分区写一个load data,比较麻烦。使用动态分区可解决以上问题,其能够根据查询获得的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统本身选择。
不确定分区数量,数据量也不是很大,使用动态分区
启动动态分区功能
hive> set hive.exec.dynamic.partition=true;
多分区单分区区别
创建多分区
hive> create table tablename (name string, nation string) partitioned by (p1 string,dt string) row format delimited fields terminated by ',' ;
插入分区
第一个分区为主分区,多分区默认模式为 主静副动,动态分区不容许主分区采用动态列而副分区采用静态列,这样将致使全部的主分区都要建立副分区静态列所定义的分区。
hive> insert overwrite table par_dnm partition(分区字段1='设置值',dt)
> select name, nation, dt from par_tab;
select 的的name,nation 对应 要插入表的第1,2个字段,分区字段1 为静态分区直接设置的默认值的,查询的dt 对应分区字段dt完成动态分区(根据查询出来的dt自行分区)。
动态分区能够容许全部的分区列都是动态分区列,可是要首先设置一个参数
查看分区设置模式
hive> set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict
它的默认值是strict,即不容许分区列所有是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,可是因为疏忽忘记为主分区列指定值了,这将致使一个dml语句在短期内建立大量的新的分区(对应大量新的文件夹),对系统性能带来影响。 因此要设置
hive> set hive.exec.dynamic.partition.mode=nostrict;
查看分区数
hive> show partitions tablename;
查看表结构
show create table tablename ;
设置分区数量
set hive.exec.max.dynamic.partitions.pernode=1000;
版权归原作者 百流 所有, 如有侵权,请联系我们删除。