问题描述:
现在每天都需要将数据采集到Hive仓库,但是每天采集的数据量不固定,有时多有时少,少的时候甚至只有一条数据。如果按天分区(将每天采集到的数据单独存储到一个分区),会出现数据量少的天数文件太小,久而久之就是小文件问题。请问怎么解决?如何重新设计分区?
初步思路:(将多天的数据存储在一个分区)
参考Kafka里面的文件存储设计,简单点说就是做一个索引表。索引表记录具体日期和对应的偏移量(当天数据所在的分区号),数据表改为以偏移量做分区。
查询时,根据具体日期通过索引表获取对应的偏移量(即该天数据所在的分区号),再拿偏移量(分区号)去数据表查数据。索引表一天一条记录,数据量很小,不会有太大负担。
判断偏移量是否+1:判断 当天之前 未存储到分区中的数据量大小是否合适开辟一个新的分区,合适就将当天数据的偏移量+1,不合适则偏移量不变。
索引表草图如图所示:
此处每次的偏移量是通过简单的+1来实现的,但是这样也存在一个问题(目前我还不清楚该问题是不是问题):数据可能会过于集中(如果数据量一直低于 可以开辟新分区的阈值,那么很多天的数据就都会被分配到同一个分区,多天的数据全堆在一起了)。
以上思路来自技术交流群中一位网友的热心分享,在此表示感谢。