1.Hive分桶表
分区提供了一个隔离数据和优化查询的方式。不过,并非所有的数据集都可以形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
分区针对的是数据的存储路径;分桶针对的是数据文件。
1.1.分桶规则
Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
1.2.分桶表操作需要注意事项
有三条注意事项:
(1)reduce的个数设置为-1,让Job自行决定需要用多少个reduce或者将reduce的个数设置为大于等于分桶表的桶数。
(2)从hdfs中load数据到分桶表,避免本地文件找不到问题。
(3)不要使用本地模式。
1.3.分桶表相关操作
(1)创建分桶表student_bucket。
create table student_bucket(id int, name string)
clustered by(id)
into 4 buckets
row format delimited fields terminated by ‘\t’;
(2)查看分桶表结构
desc formatted student_bucket;
2.Hive内部表和外部表
Hive表格式主要由元数据和表数据组成,根据两者管理方式的不同,可以分为内部表和外部表。
2.1.内部表
内部表也叫管理表(managed table),Hive 管理内部表的元数据以及表的实际数据。当使用 drop 删除内部表的时候,不但会删除表的元数据,连同其对应的数据(即数据文件),都会被删除。
在创建内部表的时候,一般不需要指定数据的存储路径,在创建的时候,会将数据的存储在 hdfs 默认的路径中,由hive.metastore.warehouse.dir参数指定。一般是:/hive/warehouse/数据库名称/表名。
当内部表的结构与分区发生变化的时候,会自动同步到元数据。
2.1.外部表
外部表叫external table,Hive 只管理外部表的元数据,表的实际数据与元数据只是做了一个映射关系,可以借助元数据信息查询到表的实际数据信息。当使用 drop 删除外部表的时候,只有元数据会被删掉,表的实际数据仍然会存放在 hdfs 对应的路径中。
在实际使用中,为了让数据存放更安全,外部表一般会搭配 location 来指定数据的存放目录,如果不使用 location ,将会默认在“ /hive/warehouse/数据库名称/表名”路径下建立数据目录。
当外部表的结构与分区发生变化的时候,则需要使用 msck repair table table_name 进行修复。
3.Hive本地表和非本地表
本地表native table,不需要借助存储处理器就可以直接管理和访问的表。建表时不需要通过“STORED BY”语句指定对应的存储处理器类。
非本地表non-native table,需要通过存储处理器才能管理和访问的表。建表时需要通过“STORED BY”语句指定对应的存储处理器类。
4.Hive抽样查询
对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。
抽样查询语法如下:
TABLESAMPLE(BUCKET x OUT OF y)
需要注意的是:x的值必须小于等于y的值。例如:
select * from student_table tablesample(bucket 1 out of 4 on id);