分区表: 分区表实际上对应HDFS文件系统上的独立的文件夹,其实就是分目录,将一个大的数据集根据业务需要分割成小的数据集。在查询时可通过where子句中的表达式选择指定的分区,以此避免全表扫描,从而提高查询效率。
分桶表: 分区提供了一个隔离数据和优化查询的便利方式,但并不是所有的数据集都可形成合理的分区。对于一张表或者分区表,可以进一步组织成桶,也就是更为细粒度的数据范围。 分桶就是将表中记录按分桶键的哈希值分散进多个小文件中,这些小文件称为桶。一般用于数据量极大的时候。
数据分散规则:分桶字段的hash值 对 分桶数量进行取模
分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件
分区表和分桶表的区别:
1.从表现形式上:分区针对的是数据的存储路径,分区表可以理解为文件夹;分桶针对的是数据文件,分桶表是文件。
2.从创建语句上:分区表使用partitioned by子句指定,分桶表由clustered by 指定。
3.从数量上:分区表的分区个数可以增长,分桶表一旦指定就不能再增长。
4.从作用上:分区可以避免全表扫描,根据分区列查询指定目录来提高查询速度
分桶的话,数据已经按照分桶字段进行了hash散列,所以分桶表数据进行 抽样和 JOIN 时可以提高MR程序效率。