Hive中桶的运用[译]

在我们的上一篇文章中,我们讨论了Hive中分区的概念。在这篇文章中,我们将讨论Hive中桶(Bucking)的概念,它在对大型数据集执行查询时提供了合适的结构。

众所周知,分区在对表执行查询时有助于提高效率。它仅扫描指定分区而不是整张表,这有助于我们以更少的时间获得结果。

现在,让我们假设有一个巨大的数据集。有时,即使在对特定字段进行分区之后,分区文件大小与实际期望值不匹配,仍然很大,此外我们还想把分区结果处理为不同的部分。为了克服这种分区问题,Hive提供了桶的概念,它允许用户将表数据集分成更易于管理的部分。

Hive中桶的特性

Hive分区将表划分为多个分区,这些分区可以进一步细分为更易于管理的部分,即桶( Buckets)或簇(Clusters)。桶的概念是基于Hash函数,这取决于列的类型。通过CLUSTERED BY语句可以将表拆分为桶。Hive的每个分区会创建成一个目录,而每个桶是一个文件。即使没有分区也可以创建桶。

桶的优点

桶表允许比非桶表有着更高效的采样。通过抽样,当原始数据集非常庞大时,我们可以尝试对一部分数据进行查询以进行测试和调试。这里,用户可以根据需要固定桶的大小。
桶也可以保持每个桶中的记录由一列或多列进行排序。由于数据文件是相同大小的,MAP连接在桶表上的速度会更快。

举例

让我们看看如何在以下示例中创建和填充桶表,其中我们尝试使用桶技术将分区表细分为基于字段的多个可管理部分。

数据集

要对数据集执行桶操作,我们需要一个数据集。你可以参考下面的链接倒入数据集real_state

字段描述:

Column 1 : Street
Column 2 : City
Column 3 : Zip
Column 4 : State
Column 5 : Beds
Column 6 : Baths
Column 7 : Sq_feet
Column 8 : flat_type
Column 9 : Price

选择数据库

我们有个名为bucketing的数据库,在其中创建一个新表执行桶操作

1.1+Show+databases

创建新表

创建一个新表input_table来存储我们数据集中的数据
(译者注:原文的图片贴错了所以这里没图。创建表还是很简单的,这里省略。。)

倒入数据

real_state数据集导入到input_table
1.3+load+real_estate+into+input_table.PNG

检查内容

显示表格的内容,查看是否倒入成功。

1.4.1+select+all+from+input_table_1.PNG

1.4.2+select+all+from+input_table_2.PNG

设置属性开启桶特性

要开启桶特性我们必须将属性hive.enforce.bucketing设置为TRUE,语句如下:

1.5+set+hive+dynamic+partitioning+and+bucketing+configurations.PNG

属性hive.enforce.bucketing = true与分区中的hive.exec.dynamic.partition = true属性类似,当我们启用该属性时,动态桶倒入会开启。

上述hive.enforce.bucketing = true属性将reduce任务的数量设置为等于表定义中提到的桶数(在我们的示例中为4),并自动从表定义中选择clustered by列。

创建桶表

1.6+bucket_table.PNG

从上面的图片,我们可以看到,我们创建了一个名为“bucket_table”的新桶表,该桶表由“city”分区,以“street”clustered by 桶大小为4。

在这里,我们已经将Hive 桶为4个部分。

从桶表中查询并获取数据

1.7+insert+and+select+from+bucket_table.PNG

1.7.2+insert+and+select+from+bucket_table.PNG

我们可以从上面的图像中观察到,我们从input_table中选择列,并将其插入到我们的桶表(bucket_table)中,该表是按city分区的。

在将input_table的内容成功插入到bucket_table之后,我们可以在浏览器中看到桶的输出结果,并且还可以在我们的本地文件系统中下载所需的城市分区桶文件。

浏览目录

下面的截图显示了带有城市的bucket_table的路径为’ANTELOPE’。

1.8.1+browse+directory.PNG

从上面的图片可以看出,在上述Hive仓库路径中为每个城市名称创建了四个桶。

1.8.2+browse+directory_2_select+output_part+file.PNG

现在,让我们通过选择下载选项下载输出部分文件结果。

1.8.3+browse+directory_3_Download+the+ouput_part+file.PNG

1.8.4+browse+directory_4_output_part+file.PNG

我们可以从上面的图片观察到,桶文件已成功下载到本地文件系统下载目录中。
很明显,桶最适合于抽样目的,并对查询性能增加了一些优化。
我们还可以根据用户的要求,通过复制粘贴相同或不同的桶文件路径,在命令行中执行上述输出。

.9+Output+in+command+line+terminal.PNG

从上述执行步骤,我们已经创建了一个结构,使用Hive中的桶技术将数据分解为更易于管理的部分或相等的部分。
我们希望这篇文章有助于理解Hive中桶的概念。

原文:Bucketing in Hive

打赏支持:如果你觉得我的文章对你有所帮助,可以打赏我哟。