使用cluster by来提高hive查询性能

时间:2018-01-10 21:04:32

标签: hive hiveql

如何通过提高群集中的查询性能?将相同的密钥发送到同一个映射器时的情况会改善性能

1 个答案:

答案 0 :(得分:1)

CLUSTER BY基本上是DISTRIBUTE BY x SORT BY x的快捷方式,因此它通常不会将记录发送到您所说的相同映射器,而是在同一个reducer上。此外,通常,它不会加快查询本身的速度,但它会用于加快对使用它生成的表的查询

DISTRIBUTE BY/CLUSTER BY用于逻辑分区。虽然传统分区保存在一个目录中,但您也可以按文件进行分区,例如,当您在256个桶中DISTRIBUTE/CLUSTER BY时,它将通过256个文件中的散列键分发您的记录。当然,仅当您的数据的基数远大于256并且用于聚类数据的密钥或多或少均匀分布时,这才有用,因此存储桶的大小大致相同。否则,囤积可能弊大于利。

回到你的问题,什么时候有用?与分区类似,在查询使用CLUSTER BY x创建的表时,遇到包含子句WHERE x = 'myvalue'的查询时,优化器将识别该子句位于存储键和256个存储桶中。前面的例子,只打开'myvalue'所在的那个,大大减少了I / O的数量(在这种情况下是1/256)。

另一种情况是连接,如果你要加入两个在同一个字段上进行分区的表,优化器可以使用o(n)mergesort进行“桶到桶”连接,因为数据已经排序,而不是在两个表上进行随机连接,通常是o(nlogn)。在非常大的数据集上,这可能意味着数小时而不是数天。