美文网首页
HIVE 表设计优化1 分区表

HIVE 表设计优化1 分区表

作者: 无来无去_A | 来源:发表于2020-08-06 16:17 被阅读0次

1. 分区表和分桶表

1. 分区表

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

  1. 引入分区表(需要根据日期对日志进行管理)
/user/hive/warehouse/log_partition/20170702/20170702.log
/user/hive/warehouse/log_partition/20170703/20170703.log
/user/hive/warehouse/log_partition/20170704/20170704.log
  1. 创建分区表语法
create table dept_partition(
          deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by '\t';

注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。

  1. 加载数据到分区表中
    hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201709');
    hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201708');
    hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201707');
    注意:分区表加载数据时,必须指定分区
image.png

加载数据到分区表

image.png
分区表
  1. 查询分区表中数据
单分区查询
hive (default)> select * from dept_partition where month='201709';
多分区联合查询
hive (default)> select * from dept_partition where month='201709'
              union
              select * from dept_partition where month='201708'
              union
              select * from dept_partition where month='201707';

_u3.deptno      _u3.dname       _u3.loc _u3.month
10      ACCOUNTING      NEW YORK        201707
10      ACCOUNTING      NEW YORK        201708
10      ACCOUNTING      NEW YORK        201709
20      RESEARCH        DALLAS  201707
20      RESEARCH        DALLAS  201708
20      RESEARCH        DALLAS  201709
30      SALES   CHICAGO 201707
30      SALES   CHICAGO 201708
30      SALES   CHICAGO 201709
40      OPERATIONS      BOSTON  201707
40      OPERATIONS      BOSTON  201708
40      OPERATIONS      BOSTON  201709

  1. 增加分区
创建单个分区
hive (default)> alter table dept_partition add partition(month='201706') ;
同时创建多个分区
hive (default)> alter table dept_partition add partition(month='201705') partition(month='201704');

6.删除分区

删除单个分区
hive (default)> alter table dept_partition drop partition (month='201704');
同时删除多个分区
hive (default)> alter table dept_partition drop partition (month='201705'), partition (month='201706');

7.查看分区表有多少分区

hive> show partitions dept_partition;

8.查看分区表结构

hive> desc formatted dept_partition;
# Partition Information          
# col_name              data_type               comment             
month                   string  

2. 分区表注意事项

1.创建二级分区表

hive (default)> create table dept_partition2(
               deptno int, dname string, loc string
               )
               partitioned by (month string, day string)
               row format delimited fields terminated by '\t';

2. 正常的加载数据

(1)加载数据到二级分区表中
hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table
 default.dept_partition2 partition(month='201709', day='13');
(2)查询分区数据
hive (default)> select * from dept_partition2 where month='201709' and day='13';

3.把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式

(1)方式一:上传数据后修复

上传数据

hive (default)> dfs -mkdir -p
 /user/hive/warehouse/dept_partition2/month=201709/day=12;

hive (default)> dfs -put /opt/module/datas/dept.txt
/user/hive/warehouse/dept_partition2/month=201709/day=12;

查询数据(查询不到刚上传的数据)

hive (default)> select * from dept_partition2 
where month='201709' and day='12';

执行修复命令

hive> msck repair table dept_partition2;

再次查询数据

hive (default)> select * from dept_partition2 where
 month='201709' and day='12';
(2)方式二:上传数据后添加分区
上传数据

hive (default)> dfs -mkdir -p
/user/hive/warehouse/dept_partition2/month=201709/day=11;

hive (default)> dfs -put /opt/module/datas/dept.txt
/user/hive/warehouse/dept_partition2/month=201709/day=11;

执行添加分区

 hive (default)> alter table dept_partition2 add
partition(month='201709',day='11');

查询数据

hive (default)> select * from dept_partition2 where
month='201709' and day='11';
(3)方式三:创建文件夹后load数据到分区
创建目录

hive (default)> dfs -mkdir -p
 /user/hive/warehouse/dept_partition2/month=201709/day=10;

上传数据

hive (default)> load data local inpath '/opt/module/datas/dept.txt'
into table dept_partition2 partition(month='201709',day='10');

查询数据

hive (default)> select * from dept_partition2 where
month='201709' and day='10';

相关文章

  • Hive优化

    这里从四个方面对 Hive 常用的一些性能优化进行了总结。 一 : 表设计层面优化 利用分区表优化 分区表 是在某...

  • Hive调优之设计篇

    从设计上来考虑HQL的优化,会涉及到表设计、数据格式以及Job任务优化等。 分区表设计Hive 分区是最有效的优化...

  • HIVE 表设计优化1 分区表

    1. 分区表和分桶表 1. 分区表 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所...

  • 【Hive】优化

    分区表的设计和优化 普通表结构问题 使用分区表可以优化上述查询问题 分桶表的设计和优化 Join问题 分桶表设计 ...

  • 坑合集

    Flume flume细节 Hive 数据倾斜Hive优化 Hive分区表新增字段为null的bug及解决方法 S...

  • hive基础语法

    目录 Hive安装和启动 Hive表操作-分区表 Hive表操作-复杂类型操作 Hive 查询语句 Zepplin...

  • create table tmp_table_name as .

    1.hive中用CTAS 创建表,所创建的表统一都是非分区表,不管源表是否是分区表。所以对于分区表的创建使用cre...

  • 案例详解__HIVE中内部表、外部表、分区表和分桶表

    目录一、Hive建表语法二、内部表外部表三、分区表四、分桶表 Hive在建表时可指定内部表、外部表、分区表和分桶表...

  • hive基本操作之一

    1.hive表中的基本数据类型 2,hive创建分区表 2.1内部表 建表语句: create table...

  • hive分区表

    hive分区表 1 为什么出现分区表? 假设有海量的数据保存在hdfs的某一个hive表明对应的目录下,使用hiv...

网友评论

      本文标题:HIVE 表设计优化1 分区表

      本文链接:https://www.haomeiwen.com/subject/bovtrktx.html