美文网首页
hive表之分区

hive表之分区

作者: 飞不高的老鸟 | 来源:发表于2019-10-19 17:18 被阅读0次

hive 是一款基于 hadoop 的、提供结构化数据组织及查询的数据仓库工具,它提供了 Hive ql方言,使用简单的 sql 就能解决大多数的数据查询工作,使得复杂的 mapreduce
编程简单化。

分区表

  • hive数据是以库和表的形式组织的,我们可以将其和 mysql 数据库表进行类比学习。hive 中存在一种特殊的表结构-分区,所谓分区,就是 hive 在数据字段之外、根据自己的组织方式额外添加到表结构中的目录属性,在 hdfs 文件中,分区属性是以文件夹的形式存在的,而真正的数据文件则是存储在相应的文件夹下,分区属性需要在创建 hive 表的时候进行指定。

创建 hive 分区表

hive> create table default.test(userid string, name string, age int) partitioned by (logday string);
  • 如上,我们创建 test 分区表,在创建时使用 partitioned by 进行指定,该表为单分区表,logday 被是指定的分区字段(在实际应用中,通常会存在多分区表的情况)

  • 现在,我们已经创建出需要的分区表,接下来我们将向分区表中插入数据并给相应的分区属性赋值。这里分为静态分区和动态分区两种。

静态分区

  • 静态分区是我们在向 hive 表中导入数据时静态指定分区。

向 test 表中导入数据,并静态创建分区 logday='20180511',然后进行分区检查。

hive> load data [local] inpath 'xxxx' into table test partition(logday='20180511');  
hive> show partitions test;
OK
logday=20180511
  • 可以看到,通过上面操作,已经成功的向分区表中导入数据,并静态指定分区。这种分区方式的好处是,我们很清楚表的每一个分区,方便我们进行数据的操作。但是当表中分区的数量过多并且未知的时候,这种指定分区的方式会使我们的工作效率大大降低。因此,在静态分区的基础上,hive 中又可以动态的进行分区操作。

动态分区

  • 所谓动态分区,就是在进行数据导入时,不给分区属性静态指定分区值,而是通过导入的数据进行动态分配。这里我们的例子是从一张表中向另一张分区表中导入数据,此时分区字段的值是未知的。

动态分区需要设置以下几个参数

hive.exec.dynamic.partition=true;  
hive.exec.dynamic.partition.mode=nonstrict; 
hive.exec.max.dynamic.partitions.pernode = 1000;
hive.exec.max.dynamic.partitions=1000;

创建另一张分区表 test_d,然后从 test 表中向其中导入数据。

hive> create table default.test_d(userid string, name string, age int) partitioned by (logday string);
hive> insert overwrite table default.test_d partition(logday)  select userid, name, age, logday from default.test;
hive> show partitions test_d;
OK
logday=20180511
logday=20180512
logday=20180513
  • 由于我们最初向 test 表中添加了日期的数据,因此在向 test_d 表中导入 test 表中的数据时,我们看到在 test_d 表中会出先多个分区的数据。也就是动态的向表 test_d 中创建了多个日期分区的数据。

其他分区相关的操作

添加分区

hive> Alter table test add partition (logday='20181014');
hive> show partitions test;
OK
logday=20180511
logday=20180512
logday=20180513
logday=20181014

删除分区

hive> Alter table test drop partition (logday='20181014');
Dropped the partition logday=20181014
OK
Time taken: 0.403 seconds
hive> show partitions test;
OK
logday=20180511
logday=20180512
logday=20180513

采用分区过滤查询,可有效提高查询效率

hive> select * from test where logday = '20180511';

总结

hive 分区表可以有效提高数据的查询效率,在查询时通过分区进行过滤,有效降低数据的检索时间。如果需要了解每一个分区值且分区较少,可以静态的进行分区,如果分区值未知,动态分区可有效提升分区效率。因此,在数据导入时,采用什么分区方式,可根据业务而定。

相关文章

  • hive基础语法

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

  • Hive系列之分区表和桶

    为提升hive数据的查询和写入性能, hive提供了分区表机制。hive每个表格可以指定多个分区key, 这些分区...

  • hive的严格模式和分区

    相比mysql,hive有严格模式存在,为了不错误扫描整个数据,hive的分区表会将数据分成几个分区。查询分区表中...

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

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

  • Spark SQL写入Hive,同分区overwrite,不同分

    摘要:Spark SQL,Hive 新建hive表 新建hive表,定义好字段类型和分区字段 Spark SQL调...

  • HiveQL 数据定义:分区

    分区• 建立分区表• 增加分区• 重命名分区• 删除分区 hive组织表到分区。它是将一个表到基于分区列,如日期,...

  • hive进阶学习

    创建hive表常用语句: 修改hive表名称: 内部表 vs 外部表: 创建分区表以及补充操作: hive中查询介...

  • Hive 1.2.1 分区和分捅

    1. 借鉴 Hive学习笔记——Hive中的分桶Hive分区和分桶(0925)HIVE表索引,分区和分桶的区别 2...

  • HiveSQL分区-DML

    分区 创建分区表 以性别分区;分区字段不可与表列名重复! 载入分区表数据 介绍load-data:Hive-DML...

  • Hive(二) 分区表、桶

    分区表 Hive中没有复杂的分区类型(List,Range,Hash)、各种复合分区,分区列不是表中的实际字段而是...

网友评论

      本文标题:hive表之分区

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