当前位置:   article > 正文

小白学Hadoop日记day11——hive分区_hive动态分区,drop分区会删除hdfs

hive动态分区,drop分区会删除hdfs

hive表的模型

image-20210707165026890

为什么分区?
hive在查询数据时为避免全表扫描而引入分区技术,分区技术就是将数据划分到多个目录中。

怎么分区?
日期、地域、年、月、小时等一切能将数据分散开的标识即可。

分区的本质:
在表或者分区下创建目录。分区目录名称是:分区字段=分区值    比如:dt=20210707

分区字段:
mysql的分区字段使用的是表内字段;
hive的分区字段使用的是表外字段。


分区语法:
-- 在创建Hive表时加上下面分区语法
[PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)]


注意事项:
1.hive的分区名不区分大小写
2.hive的分区字段是一个伪字段,不会再表中出现,但是可以用于过滤等查询。
3.一张表可以有一个或者多个分区,并且分区下面也可以有一个或者多个分区。

三级分区

  1. -- 三级分区
  2. create table if not exists part3(
  3. id int,
  4. name string
  5. )
  6. partitioned by (year string,month string,day string)
  7. row format delimited fields terminated by ',';
  8. -- 加载数据 insert into
  9. insert into part3 partition(year='2021',month='07',day='08')
  10. select
  11. id,
  12. name
  13. from part1
  14. where dt = '20210708';
  15. --load方式加
  16. load data local inpath '/home/part2' into table part3 partition(year='2021',month='07',day='08');
  17. load data local inpath '/home/part1' into table part3 partition(year='2021',month='07',day='07');

分区操作

  1. -- 查看分区
  2. show partitions part1;
  3. -- 添加单分区
  4. alter table part1 add partition(dt='2021-07-09');
  5. -- 添加多个分区
  6. alter table part1 add partition(dt='20210709') partition(dt='20210710');
  7. -- 增加分区并制定数据
  8. alter table part1 add partition(dt='2021-07-11') location '/input';
  9. -- 修改分区的hdfs路径(直接修改元数据)
  10. alter table part1 partition(dt='2021-07-11') set location '/out/01'; --也行
  11. alter table part1 partition(dt='2021-07-11') set location 'hdfs://hadoop01:9000/out/01';
  12. -- 删除分区(删除元数据、文件)---外部表是不会删除hdfs中的分区数据的
  13. alter table part1 drop partition(dt='20210709');
  14. alter table part1 drop partition(dt='2021-07-09'),partition(dt='2021-07-11');

静态分区

  1. 静态分区:加载分区时指定分区值.
  2. 动态分区:加载分区时未指定分区值。历史数据或者一段时间的数据存放到一起,后期需要将其分区。
  3. 混合分区:既有静态又有动态。
  4. 动态分区属性:
  5. 动态分区的属性:
  6. hive.exec.dynamic.partition=true
  7. hive.exec.dynamic.partition.mode=nonstrict
  8. hive.exec.max.dynamic.partitions=1000
  9. hive.exec.max.dynamic.partitions.pernode=100
  10. --创建表
  11. create table dy_part2(
  12. id int,
  13. name string
  14. )
  15. partitioned by (year string,month string,day string)
  16. row format delimited fields terminated by ',';
  17. create table dy_part3(
  18. id int,
  19. name string
  20. )
  21. partitioned by (year string,month string,day string)
  22. row format delimited fields terminated by ',';
  23. -- 动态加载
  24. set hive.exec.dynamic.partition.mode=nonstrict;
  25. insert into dy_part2 partition(year,month,day)
  26. select
  27. id,
  28. name,
  29. year,
  30. month,
  31. day
  32. from part3
  33. ;
  34. -- 混合分区加载
  35. insert into dy_part3 partition(year='2021',month,day)
  36. select
  37. id,
  38. name,
  39. month,
  40. day
  41. from part3
  42. where year = '2021'
  43. ;

严格模式

  1. 严格模式至少要有一个静态分区,非严格模式可以全是动态分区
  2. set hive.mapred.mode=nonstrict/strict;
  3. <name>hive.mapred.mode</name>
  4. <value>nonstrict</value>
  5. <description>
  6. The mode in which the Hive operations are being performed.
  7. In strict mode, some risky queries are not allowed to run. They include:
  8. Cartesian Product. 笛卡尔积查询
  9. No partition being picked up for a query. 分区表不用分区字段过滤
  10. Comparing bigints and strings. bigint和string比较查询
  11. Comparing bigints and doubles. bigint和doubles比较查询
  12. Orderby without limit. orderby语句不带limit查询
  13. </description>
  14. #如下语句不允许查询
  15. hive (test)> select * from flow2 order by up desc;
  16. hive (test)> select * from part3;
  17. 分区注意事项:
  18. 1. 分区字段不建议使用中文。
  19. 2. 一般不建议使用动态分区,因为动态分区会使用mapreduce来进行查询数据,如果分区数据过多,导致`namenode`和`resourcemanager`的性能瓶颈。所以建议在使用动态分区前尽可能预知分区数量。
  20. 3. 分区属性的修改都可以修改元数据和hdfs数据内容。
  21. 4、分区表一般适用于行为数据。

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

闽ICP备14008679号