hive的分桶抽样查询

155 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

本文介绍一种特别的查询方式,在hive中也有支持分桶抽样查询,可以按照随机抽样或者指定桶数的方式对数据进行查询获取。

在hive中还有一个分区的概念,简单的理解分区就是将hive的全量数据存储在不同的文件夹当中,对不同分区的数据有不同的存储路径,按照一定的规则进行分区的命名,而对分区的数据一般都是做全量更新的,这样做的目的是提高查询效率,降低hive的查询压力。

而这里的分桶概念就是分区大不相同,分区可以起到隔离数据优化查询的好处。而分桶其实也是一种数据集分解的能力,分桶则是在对数据的管理层面起到更多的作用,也是可以将数据分解成若干部分。

使用分桶逻辑的代码如下所示,在使用分桶逻辑前,需要先建立分桶机制,这块在前面的文章中已经详细介绍过,大家可以回看一下。


select name, student_id from student TABLESAMPLE (BUCKET 4 OUT OF 8 ON student_id);
​
select name, student_id from student TABLESAMPLE (BUCKET 4 OUT OF 8 ON RAND() );

依据上述的例子中,可以看到核心的下面这一句代码就是分桶抽样查询的语法逻辑。


tablesample(bucket x out of y) 

详细介绍一下这一层的逻辑,在创建表的时候可以指定分桶数量,并插入到student的id列当中。

create table test_bucket (id INT) CLUSTERED BY (id) INTO 3 BUCKETS;

上述语句首先创建一个 test_student_bucket表,并将 test_student_bucket 表划分为3个桶,然后将 student 表中的 id 列数据插入 test_student_bucket表中。插入的数据会被保存在3个文件中,每个桶一个文件,保存在 test_student_bucket表路径下。

分桶的应用更广泛的用到抽样查询中,全部结果特别多的时候,我们只需要一些代表性的查询结果,而不是全部数据,就可以用到分桶的概念。hive就会用到分桶对数据进行抽样查询以此来满足用户中只需要部分查询的需求。