我基于列flightnum(10个桶)创建了表格,数据大小约为700MB,并且也强制执行。
当我执行查询时: 从flight_buck中选择count(flightnum),其中flightnum = 10; 得到约46s的响应。地图总数为27。
在具有相同数据的非分段表上执行相同查询时: 从flight_temp中选择count(flightnum),其中flightnum = 10; 获得约47秒的响应。使用的地图集总数为30。
为什么我会在相同的时间内收到回复?
答案 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只处理具有相同键的记录,并使用您喜欢的排序将数据存储到其文件中,在这种情况下按日期
让我们来看看HDFS ......
请注意我们得到了什么.. 306个文件(桶)......
并且每个内部都有具有相同聚类键的记录......
但所有文件都放在同一个文件夹中,当使用hive进行SELECTing时,无法理解哪些文件保存了我们正在寻找的值,因此没有分区的分段不会加快选择,因为没有关于我们正在寻找的数据在哪里。
bucketing做什么?当您正在加入数据时,整个存储桶可以加载到RAM中,我们可以在MAP中快速加入,而不是在REDUCE中慢速加入。