[Hive_8] Hive 设计优化


0. 说明

  在 Hive 中,数据库是一个文件夹,表也是文件夹

  partition,是一个字段,是文件

  前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数据,性能极差,partition 就是为了避免全表扫描

 

  bucket(桶表)

  避免多级分区导致分区目录过多,以指定字段进行 hash 分桶

  新型数据结构,以文件段的形式在分区表内部按照指定字段进行分隔

  重要特性:优化 join 的速度

 


1. 分区

  1.1 创建非分区表 user_nopar

    create table user_nopar
    (id int, name string, age int, province string, city string)
    row format delimited
    fields terminated by '\t';

 

  1.2 加载数据

load data local inpath '/home/centos/files/user_nopar.txt' into table user_nopar;

 

  1.3 创建分区表 user_par

    create table user_par(id int, name string, age int)
    partitioned by(province string, city string)
    row format delimited
    fields terminated by '\t';

 

  1.4 手动添加分区

  alter table user_par add partition(province='beijing',city='beijing');

 

  1.5 将数据加载到指定分区(分区可以不存在)

  load data local inpath '/home/centos/files/customers.txt' 
  into table user_par
  partition (province='shanxi',city='taiyuan');

 

  1.6 将表清空

    truncate table user_par;

 

  1.7 设置动态分区非严格模式,无需指定静态分区

  set hive.exec.dynamic.partition.mode=nonstrict;

 

  1.8 插入数据动态指定分区

insert into user_par
partition(province,city)
select * from user_nopar;

   (PS: 在动态插入分区字段时注意,字段顺序必须要和分区顺序保持一致,和字段名称无关)

 

  1.9 删除分区

alter table  user_par2 drop partition(province='sichuan');

 

  1.10 insert 数据到分区表

insert into user_par2 partition(province='USA', city='NewYork') select 10,'jerry',30;

 

  1.11 查看指定表的分区

  show partitions user_par2;

 

  1.12 建立分区的依据

  1. 以日期或时间进行分区 比如 year, month, and day
  2. 以位置进行分区 比如 country, territory, state, and city
  3. 以业务逻辑进行分区

 


2. 分桶

  2.1 创建桶表

create table user_bucket(id int, name string, age int) CLUSTERED BY (id) INTO 2 BUCKETS row format delimited fields terminated by '\t';

 

  2.2 在桶表中转储数据

  insert into user_bucket select id, name , age from user_par2;

 

  2.3 查看 HDFS 中桶表的数据结构

 

  2.4 将桶表和分区表一同使用建立新表 user_new, 分区在前

create table user_new(id int, name string, age int)
partitioned by (province string, city string)
CLUSTERED BY (id) INTO 2 BUCKETS
row format delimited
fields terminated by '\t';

 

  2.5 通过 load 加载数据

  load 并不会修改表中的数据结构,在桶表中的体现,就是没有将数据进行分段

load data local inpath '/home/centos/files/customers.txt' into table user_new partition (province='sichaun',city='chengdu');

 

  2.6 insert 数据

insert into user_new partition(province='USA', city='NewYork') select 10,'jerry',30;

 

  2.7 指定分桶字段

  通过 join 字段进行桶字段的确定,在以下场景中分桶字段 a => no , b => uid

SELECT a.no, a.name, b.oname, b.oprice from customers a inner join orders b on a.no=b.uid;

 


3. 内部表 & 外部表

  3.1 内部表

  删除内部表的同时也会删除元数据,删除真实数据
  MANAGED_TABLE 也叫托管表,是默认表类型

  3.2 外部表


  删除外部表的同时只删除元数据,不删除真实数据
  场景:为了防止 drop 或者 truncate 表的时候数据丢失的问题
  创建 external table

 

    create external table user_external(id int, name string, age int);

    insert into user_external select id,name,age from user_par;

 

 

 

 

 


 

posted @ 2019-01-05 18:27  山间一棵松  阅读(333)  评论(0编辑  收藏  举报