在Hive中没有优化Bucketing

时间:2016-10-09 11:18:39

标签: hadoop hive bigdata

我基于列flightnum(10个桶)创建了表格,数据大小约为700MB,并且也强制执行。

当我执行查询时: 从flight_buck中选择count(flightnum),其中flightnum = 10; 得到约46s的响应。地图总数为27。

在具有相同数据的非分段表上执行相同查询时: 从flight_temp中选择count(flightnum),其中flightnum = 10; 获得约47秒的响应。使用的地图集总数为30。

为什么我会在相同的时间内收到回复?

1 个答案:

答案 0 :(得分:3)

Bucketing有助于加快速度,提高您使用分区表的简单SELECT速度。 尝试通过flightnum对表进行分区,然后再次运行选择。

为什么会这样?

让我们创建一个这样的分区表:

create table `t1b`( 
  `exchange` string,
  `stock_symbol` string,
  `date` string,
  `stock_price_open` float,
  `stock_price_high` float,
  `stock_price_low` float,
  `stock_price_close` float,
  `stock_volume` int,
  `stock_price_adj_close` float)
clustered by ( `stock_symbol` ) sorted by ( `date` ) into 306 buckets;

让我们用数据填充......有尽可能多的reducer,因为每个reducer只处理具有相同键的记录,并使用您喜欢的排序将数据存储到其文件中,在这种情况下按日期

enter image description here

让我们来看看HDFS ......

请注意我们得到了什么.. 306个文件(桶)......

enter image description here

并且每个内部都有具有相同聚类键的记录......

enter image description here

但所有文件都放在同一个文件夹中,当使用hive进行SELECTing时,无法理解哪些文件保存了我们正在寻找的值,因此没有分区的分段不会加快选择,因为没有关于我们正在寻找的数据在哪里。

bucketing做什么?当您正在加入数据时,整个存储桶可以加载到RAM中,我们可以在MAP中快速加入,而不是在REDUCE中慢速加入。