【使用分享】Hive分区表那些事

举报
蓝极光 发表于 2021/05/28 14:48:03 2021/05/28
【摘要】 一、 静态分区1.创建静态分区格式:create table employees ( name   string, salary  float, subordinated array<string>, deductions map<string,float>, address  struct<street:string,city:string,state:string,zip:int> ) ...

一、 静态分区
1.创建静态分区格式:
create table employees (
 name   string,
 salary  float,
 subordinated array<string>,
 deductions map<string,float>,
 address  struct<street:string,city:string,state:string,zip:int>
 ) partitioned by (country string,state string)
 row format delimited
 fields terminated by "\t"
 collection items terminated by ","
 map keys terminated by ":"
 lines terminated by "\n"
 stored as textfile;

创建成果后发现他的存储路径和普通的内部表的路径是一样的而且多了分区表的字段,因为我们创建的分区表并没内容,事实上,除非需要优化查询性能,否则实现表的用户不需要关系"字段是否是分区字段"

2.添加分区表
   alter table employees add  partition (country="china",state="Asia");
   查看分区表信息: show partitions employees;
   hdfs上的路径:/user/hive/warehouse/zxz.db/employees/country=china/state=Asia  他们都是以目录及子目录形式存储的

3.插入数据:
  格式:
  INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row …];
  格式2:(推荐使用)
  load data local inpath '/home/had/data1.txt' into table employees partition (country =china,state=Asia)
4.利用分区表查询:(一般分区表都是利用where语句查询的)

5.CTAS语句和like
  创建表,携带数据
  create table employees1 as select * from employees1
  创建表,携带表结构
  create table employees2 like employees

6.外部分区表:
  外部表同样可以使用分区,事实上,用户会发现,只是管理大型生产数据集最常见的情况,这种结合给用户提供一个和其他工具共享数据的方式,同时也可以优化查询性能

  create external table employees_ex(
   name   string,
   salary  float,
   subordinated array<string>,
   deductions map<string,float>,
   address  struct<street:string,city:string,state:string,zip:int>
   ) partitioned by (country string,state string)
   row format delimited
   fields terminated by "\t"
   collection items terminated by ","
   map keys terminated by ":"
   lines terminated by "\n"
   stored as textfile;  
   location "/user/had/data/"    //他其实和普通的静态分区表一样就是多了一个external关键字
    这样我们就可以把数据路径改变而不影响数据的丢失,这是内部分区表远远不能做的事情:
 

  (因为我们创建的是外部表)所有我们可以把表数据放到hdfs上的随便一个地方这里自动数据加载到/user/had/data/下(当然我们之前在外部表上指定了路径)
  load data local inpath '/home/had/data.txt' into table employees_ex partition (country="china",state="Asia");

  如果我们加载的数据要分离一些旧数据的时候就可以hadoop的distcp命令来copy数据到某个路径
  hadoop distcp /user/had/data/country=china/state=Asia /user/had/data_old/country=china/state=Asia

  修改表,把移走的数据的路径在hive里修改
  alter table employees partition(country="china",state="Asia") set location '/user/had/data_old/country=china/state=Asia'

  使用hdfs的rm命令删除之前路径的数据
  hdfs dfs -rmr /user/had/data/country=china/state=Asia

  如果觉得突然忘记了数据的位置使用使用下面的方式查看
  describe extend employees_ex partition (country="china",state="Asia");

7.删除分区表
  alter   table employees drop partition(country="china",state="Asia");

8.众多的修改语句
  把一个分区打包成一个har包
  alter table employees archive partition (country="china",state="Asia")

  把一个分区har包还原成原来的分区
  alter table employees unarchive partition (country="china",state="Asia")

  保护分区防止被删除
  alter table employees partition (country="china",state="Asia") enable no_drop

  保护分区防止被查询
  alter table employees partition (country="china",state="Asia") enable offline

  允许分区删除和查询
  alter table employees partition (country="china",state="Asia") disable no_drop
  alter table employees partition (country="china",state="Asia") disable offline

9.通过查询语句向表中插入数据
  insert overwrite/into  table copy_employees partition (country="china",state="Asia") select * from employees es where    es.country="china" and  es.state ="Asia"

二、动态分区:

  为什么要使用动态分区呢,我们举个例子,假如中国有50个省,每个省有50个市,每个市都有100个区,那我们都要使用静态分区要使用多久才能搞完。所有我们要使用动态分区。
  动态分区默认是没有开启。开启后默认是以严格模式执行的,在这种模式下需要至少一个分区字段是静态的。这有助于阻止因设计错误导致导致查询差生大量的分区。列如:用户可能错误使用时间戳作为分区表字段。然后导致每秒都对应一个分区!这样我们也可以采用相应的措施:
  关闭严格分区模式
  动态分区模式时是严格模式,也就是至少有一个静态分区。
  set hive.exec.dynamic.partition.mode=nonstrict        //分区模式,默认nostrict
  set hive.exec.dynamic.partition=true                  //开启动态分区,默认true
  set hive.exec.max.dynamic.partitions=1000             //最大动态分区数,默认1000

1,创建一个普通动态分区表:
create table if not exists  zxz_5(
 name string,
 nid int,
 phone string,
 ntime date
 ) partitioned by (year int,month int)
 row format delimited
 fields terminated by "|"
 lines terminated by "\n"
 stored as textfile;

2.动态分区表入数据:注意插入数据的列名需定义测和分区字段名相同
insert overwrite table  zxz_5 partition (year,month) select name,nid,phone,ntime,year(ntime) as year ,month(ntime) as month from zxz_dy;

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。