未在hive中优化bucketing

kjthegm6  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(265)

我有一个基于列flightnum(10个bucket)的bucketed表,数据大小约为700mb,也强制使用bucketing。
执行查询时:从flightnum=10的flightbuck中选择count(flightnum);在大约46秒内得到回应。绘图员总数为27人。
对具有相同数据的非嵌套表执行相同查询时:从flightnum=10的flighttemp中选择count(flightnum);在大约47秒内得到回应。使用的绘图员总数为30人。
为什么我能在同样的时间里得到回应?

nszi6y05

nszi6y051#

bucketing有助于加快join的速度,以提高使用分区表时的简单选择速度。尝试按flightnum对表进行分区,然后再次运行selects。
为什么会这样?
让我们创建一个带扣的非分区表,如下所示:

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的数量和bucket的数量一样多,因为每个reducer只处理具有相同键的记录,并使用您喜欢的排序(这里是按日期)将数据存储到其文件中

让我们看看hdfs。。。
请注意我们得到了什么。。306个文件(存储桶)。。。

在每一个记录中都有相同的聚类键。。。

但是所有的文件都在同一个文件夹中,当使用配置单元进行选择时,无法了解哪些文件包含我们要查找的值,因此不分区的bucketing并不能加快选择的速度,因为没有关于我们要查找的数据在何处的信息。
扣球是干什么的?当您连接数据时,整个bucket可以加载到ram中,我们可以得到一个快速连接map,而不是一个慢速连接reduce。

相关问题