什么时候我们不应该在蜂巢中使用桶?

时间:2016-10-02 09:55:44

标签: hadoop hive

什么时候不应该在蜂巢中使用桶装?这项技术的瓶颈是什么?

3 个答案:

答案 0 :(得分:1)

我猜你不能在不能从中受益时使用bucketing。据我所知,在划分的主要好处中:更高效的采样和地图侧连接(见下文)。因此,如果您的表很小或者您不需要快速采样和地图侧连接,请不要使用它,因为您需要记住在插入之前必须先将数据打包,手动或使用set hive.enforce.bucketing = true;它不是瓶颈,它只是一种可能的数据布局,可以让你在某些情况下占据优势。

Hive地图侧连接示例(see more here):

  

如果正在连接的表在连接列上被缓冲,并且一个表中的存储桶数是另一个表中存储桶数量的倍数,则存储桶可以相互连接。如果表A有4个桶,而表B有4个桶,则以下连接

SELECT a.key, a.value
FROM a JOIN b ON a.key = b.key
  

只能在mapper上完成。而不是完全取B   A的每个映射器,只获取所需的桶。对于查询   以上,A的映射器处理桶1仅获取桶1   B.它不是默认行为,由以下内容管理   参数

set hive.optimize.bucketmapjoin = true

更新考虑分组时的数据偏差。

使用hash_function(bucketing_column) mod num_buckets计算的铲斗数量。如果您的bucketing列是int类型,那么hash_int(i) == isee more here)。因此,如果您在该列中存在偏差值,则一个值会比其他值更频繁地显示,然后会在相应的存储桶中放置更多行,您将拥有不成比例的存储桶,这会损害查询速度。 Hive有内置工具来克服数据偏差(参见Skewed Tables),但我认为你不应该首先使用带有偏斜数据的列来进行分段。

答案 1 :(得分:0)

Bucketing是我们将数据分发到文件中的方法。否则会分布不均。

何时使用Bucketing:当我们知道查询将使用" customer_id"等列时这是顺序或均匀分布的。

何时不使用Bucketing:当我们知道表的大多数用例涉及读取数据子集时,我们不会使用bucketing。

例如:虽然我们保留历史数据,但我们只处理最近2周的数据以确定某些内容。在这种情况下,我们将使用week by weekno。

答案 2 :(得分:0)

当分区字段的基数不太高时,您不希望使用存储桶。在这种情况下,分区会更有益。 而存储只能在一个字段上进行,而分区可以在多个字段上进行,并按(国家,城市,州)的顺序进行。