关于程序员:Hive分区分桶

7次阅读

共计 2706 个字符,预计需要花费 7 分钟才能阅读完成。

分区

分区概念

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

本文由华为云公布

正文完
 0