Hive知识点:索引、分区表、分桶表、抽样查询

索引

在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量;

分区表 PARTITIONE BY

将表中的数据,分散到表目录下的多个子目录(分区目录)中
目的在执行查询时只查询某些子目录中的数据加快查询效率
导入数据时候需要指定向哪个分区导入数据
相当于在表中增加一列分区列
分区 使用 “列名=值” 的形式
已有数据 可通过自动修复分区

分桶表 CLUSTERED BY

和MR中分区是一个概念,把数据分散到多个文件中
分桶本质上也是为了分散数据,在分桶后,可以结合hive 提供的抽样查询,只查询指定桶的数据
在分桶时可以使用SORTED BY
向分桶表导入数据会执行MR程序进行数据hash运算实现分桶
导入数据前需要设置强制分桶 set hive.enforce.buckering=true 和强制排序 set hive.enforce.sorting=true

索引分区分桶区别

索引和分区最大的区别就是索引不分割数据表,分区分割数据库。
索引其实就是拿额外的存储空间换查询时间,但分区已经将整个大数据库按照分区列拆分成多个小数据库了。
分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。
其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。
普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件。

索引 通过索引表记录指定列中数据的offset划分
分区 使用添加列的方式 对数据进行划分(到多个目录中)
分桶 使用指定列的方式通过hash算法分为指定数量 的桶(文件)列中相同hash值相同划分为一文件中

抽样查询

select * from 分桶表 tablesample(bucket 1 out of 4 on 分桶表字段);
bucket x out of y on 要求 y必须时z的因子或倍数
bucket 1 out of 4 on
假设当前表一共分了8个桶
从第1个桶开始抽 每隔4桶抽一次,一共抽 8/4 个桶。

你可能感兴趣的:(#,Hive)