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