为什么要对数据进行分区
在实际生产中,每天的数据量都是以亿为单位的,如果我们不对数据进行分区,直接对全部数据进行统计,则会大大增加时间开销,浪费大量资源。当我们做了合理分区后,例如按天进行分区,当查找某一天的数据时,Hive不会读取全部文件,只会读取HDFS中该天对应的目录,大大提高了执行效率。
分区是不是越多越好
多数情况下,对数据可以按天进行分区,如果数据量还是太大,可以考虑再按小时进行分区,或者取另一个维度作为分区条件,在此基础上,还可以按分钟,秒进行分区,但是进行过多的分区并不一定会加快查询执
行效率。
使用过多的分区可能导致创建了很多非必须的Hadoop文件和文件夹,一个分区对应着一个包含了多个文件的文件夹。如果对表进行过多分区,又存储了跨度很久的数据,最后就会超出NameNode对系统的管理能力,因为NameNode必须保存文件系统的元数据信息,当小文件过多时,会限制HDFS所能管理的文件总数上限。
另外,MR会将一个job转化为多个task,默认情况下,每个task都是一个新的JVM实例,而JVM的开启和销毁都是需要时间开销的,对于每个小文件产生的task,JVM创建和销毁的开销可能会大于对文件内容本身进行处理的开销。
此外,默认情况下,Hive还会限制动态分区可以创建的最大分区数。
对数据进行分桶
分桶是将数据集分解为更容易管理的若干部分的另一种方法。
以下将创建一个按时间分区,使用user_id作为分桶字段的测试表,us