分区

分区概念

在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据依照分区键的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中须要留神的是分区键的值不肯定要基于表的某一列(字段),它能够指定任意值,只有查问的时候指定相应的分区键来查问即可。咱们能够对分区进行增加、删除、重命名、清空等操作。分为动态分区和动静分区两种,动态分区与动静分区的次要区别在于动态分区是手动指定,而动静分区是通过数据来进行判断。具体来说,动态分区的列切实编译期间,通过用户传递来决定的;动静分区只有在 SQL 执行时能力决定。

分区案例

Hive的分区性能能够帮忙用户疾速的查找和定位,这里咱们给出了一个利用场景,通过应用Hive分区性能创立日期和小时分区,疾速查找定位对应的用户与IP地址。具体步骤如下:

步骤 1 创立一张分区表,蕴含两个分区dt和ht别离示意日期和小时:

CREATE TABLE partition_table001 ( name STRING, ip STRING ) PARTITIONED BY (dt STRING, ht STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

步骤 2 启用hive动静分区时,须要设置如下两个参数:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

步骤 3 把partition_table001表某个日期分区下的数据(如下图所示)load到指标表partition_table002中。

  • 如果没有指标表则创立指标表partition_table002:

CREATE TABLE IF NOT EXISTS partition_table002 LIKE partition_table001;

  • 如果应用动态分区,必须指定分区的值,如将partition_table001表中日期分区为“20190520”、小时分区为“00”的数据加载入表partition_table002中:

INSERT OVERWRITE TABLE partition_table002 PARTITION (dt='20190520', ht='00') SELECT name, ip FROM partition_table001 WHERE dt='20190520' and ht='00';

查问一下表partition_table002中咱们插入的数据,后果如下图所示:

  • 如果心愿插入每天24小时的数据,则须要执行24次下面的语句。而应用动静分区会依据select出的后果主动判断数据该load到哪个分区中去,只须要一句语句即可实现,命令及后果如下所示:

INSERT OVERWRITE TABLE partition_table002 PARTITION (dt, ht) SELECT * FROM partition_table001 WHERE dt='20190520';

步骤 4 查看表格partition_table002下的所有分区信息应用如下命令:

SHOW PARTITIONS partition_table002;

或者领有admin权限的用户应用dfs –ls <表存储目录>命令如下:

dfs -ls hdfs://hacluster/user/hive/warehouse/partition_table002;

阐明:
动态分区和动静分区能够混合应用,在动静联合应用时须要留神动态分区值必须在动静分区值的后面,在select中按地位程序呈现在最初(因为动态分区提前产生,动静分区运行时产生)。如果动静分区作为父门路,则子动态分区无奈提前生成,会报错为动静分区不能为动态的父门路。当动态分区是动静分区的子分区时,执行DML操作会报错。因为分区程序决定了HDFS中目录的继承关系,这点是无奈扭转的。

分桶

分桶概念

对于每一个表或者分区, Hive能够进一步组织成桶,也就是说分桶是更为细粒度的数据范畴划分。Hive会计算桶列的哈希值再以桶的个数取模来计算某条记录属于那个桶。把表(或者分区)组织成桶(Bucket)有两个理由:

  1. 取得更高的查询处理效率。桶为表加上了额定的构造,Hive在解决有些查问时能利用这个构造。具体而言,连贯两个在(蕴含连贯列的)雷同列上划分了桶的表,能够应用Map端连贯(Map-side join)高效的实现。
  2. 使取样(sampling)更高效。在解决大规模数据集时,在开发和批改查问的阶段,如果能在数据集的一小部分数据上试运行查问,会带来很多不便。

分桶案例

步骤 1 创立一张含有桶的表格,例如创立一个含有四个桶的表格bucketed_table:

CREATE TABLE bucketed_table (id INT, name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;

步骤 2 设置hive.enforce.bucketing属性为true,以便自动控制上reduce的数量从而适配bucket的个数,举荐命令如下(当然也能够手动设置参数“mapred.reduce.task”去适配bucket的个数,只是屡次手动批改会比拟麻烦):

set hive.enforce.bucketing = true;

步骤 3 向表里插入筹备好的没有划分桶的数据,例如将没有划分桶的表users的数据插入指标表bucketed_table:

INSERT OVERWRITE TABLE bucketed_table SELECT * FROM users;

步骤 4 查看表格bucketed_table下的所有分桶信息,须要领有admin权限的用户应用dfs –ls <表或分区存储目录>命令如下:

dfs -ls hdfs://hacluster/user/hive/warehouse/bucketed_table;

步骤 5 对桶中的数据进行采样,应用抽样命令TABLESAMPLE(BUCKET x OUT OF y),例如对表格bucketed_table从第一个桶开始抽取1个桶数据量的样本:

SELECT * FROM bucketed_table TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);

阐明:
抽样命令TABLESAMPLE(BUCKET x OUT OF y)中,y必须是表格中分桶数的倍数或者因子。Hive依据y的大小,决定抽样的比例。x示意从哪个桶开始抽取。例如,表格的总分桶数为16,tablesample(bucket 3 out of 8),示意总共抽取(16/8=)2个bucket的数据,别离为第3个桶和第(3+8=)11个桶的数据。

本文由华为云公布