什么时候不应该在蜂巢中使用桶装?这项技术的瓶颈是什么?
答案 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) == i
(see more here)。因此,如果您在该列中存在偏差值,则一个值会比其他值更频繁地显示,然后会在相应的存储桶中放置更多行,您将拥有不成比例的存储桶,这会损害查询速度。 Hive有内置工具来克服数据偏差(参见Skewed Tables),但我认为你不应该首先使用带有偏斜数据的列来进行分段。
答案 1 :(得分:0)
Bucketing是我们将数据分发到文件中的方法。否则会分布不均。
何时使用Bucketing:当我们知道查询将使用" customer_id"等列时这是顺序或均匀分布的。
何时不使用Bucketing:当我们知道表的大多数用例涉及读取数据子集时,我们不会使用bucketing。
例如:虽然我们保留历史数据,但我们只处理最近2周的数据以确定某些内容。在这种情况下,我们将使用week by weekno。
答案 2 :(得分:0)
当分区字段的基数不太高时,您不希望使用存储桶。在这种情况下,分区会更有益。 而存储只能在一个字段上进行,而分区可以在多个字段上进行,并按(国家,城市,州)的顺序进行。