使用 cluster by 提高 hive 查询性能

using cluster by to improve hive query performance

cluster by 如何提高 hive 中的查询性能?将相同的键发送到相同的映射器会提高性能的情况是什么

CLUSTER BY 基本上是 DISTRIBUTE BY x SORT BY x 的快捷方式,因此它通常不会像您所说的那样将记录发送到同一个 mapper,而是,在同一个减速器上。此外,通常情况下,它不会加速查询本身,但它用于加速 由它生成的 table 上的查询

DISTRIBUTE BY/CLUSTER BY 用作逻辑分区。传统的分区是保存在一个目录中,但你也可以按文件分区,比如你在256个桶中DISTRIBUTE/CLUSTER BY,它会把你的记录按hash key分布在256个文件中。当然,只有当您的数据的基数远大于 256 并且您用于对数据进行聚类的键或多或少均匀分布时,这才有用,因此桶的大小大致相同。否则分桶可能弊大于利。

回到你的问题,什么时候有用?与分区类似,当查询使用 CLUSTERED BY x 创建的 table 时,当遇到包含子句 WHERE x = 'myvalue' 的查询时,优化器将识别该子句在分桶键上,并且前一个例子的 256 个桶,只会打开 'myvalue' 所在的桶,从而显着减少 I/O 的数量(在本例中为 1/256)。

另一种情况是联接,如果您要联接在同一字段上分桶的两个 table,优化器可以使用 o(n) mergesort 执行 'bucket to bucket' 联接,因为数据已经排序,而不是对两个 table 进行随机连接,这通常是 o(nlogn)。在非常大的数据集上,这可能意味着数小时而不是数天。