行为数据存储中的分区和分桶

行为数据存储中的分区和分桶

行为数据存储中的分区和分桶

存储引擎一般都支持分区分桶

分区的意义在于将数据分散到多个子目录中,在执行查询时,可以只选择查询某些子目录中的数据来加快查询效率。

分桶的意义实际和分区一样,只是并非所有的数据都可以形成合理的分区,而分桶可以弥补分区这个缺陷,将数据集分解为若干部分

分区可以做多级分区,分区的个数可以指定,也可以由程序自动生成, 分区是可以动态增长的

分桶的个数是一经决定,就不能更改,所以如果要改变桶数,要重新插入分桶数据

行为数据本质是时序数据,所以分割的关键要素第一肯定是 时间,第二个分割的关键要素就是 事件

如果是用分区来做,建个日期+事件的 二级分区,存储时候 实际上就分成了 2级目录,这个的弊端就是如果事件太多太碎,会导致很多小事件也单独分区了

所以就考虑用分桶,但是Hive自带的分桶是根据事件值的hash值 然后分成指定个数的桶

这样能避免数据文件太多,但是还有缺陷,因为你控制不了把哪些事件放在一起,我们分桶肯定希望经常一起使用的事件 分成一个桶,低频使用的,数据量特别大的分成一个桶

为了能实现上述的效果,所以就设计了2个分桶方案:
第一个 直接冗余一个桶ID。然后 事件和 桶ID之间的关系作为元数据维护,然后根据这个桶ID 直接分区就行
还有一个 相对轻一点就是动态分。也是 维护一个 桶ID 和 事件之间的关系,在dump 成hive的时候 或者 merge的时候,根据 这个关系 把对应的数据 写到指定命名的数据文件中。在查询的时候 根据事件id直接在connector中 解析 查询对应的桶文件


Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×