分区与分桶都是为了提升Hive的查询效率.两者也可以同时存在.也可以独立存在.具体可以根据自己的业务情况进行选择,创建不同类型的表.
- 分区是根据数据某一个字段新建一个目录.以增加相同数据的查询效率.
- 分桶是根据数据的某一个字段,在分区或者根目录下创建一个文件,多少个文件就是分桶数.同样可以提升单表查询的效率,另外如果是关联查询,则也会提升关联查询的效率.因为根据关联字段查找对应的文件就行了[email protected]
创建的语法如下:
CREATE [EXTERNAL] TABLE ([, ...])] [PARTITIonED BY ...] CLUSTERED BY ( ) [SORTED BY ( [ASC|DESC] [, [ASC|DESC]...])] INTO BUCKETS [ROW FORMAT ] [STORED AS TEXTFILE|ORC|CSVFILE] [LOCATION ' '] [TBLPROPERTIES (' '=' ', ...)];
举例:
-- sorted by 桶内的数据排序,可以有多个 -- clustered by 根据哪一个字段进行分桶 -- Distribute by 如果分桶跟排序的字段不一样则使用它来分桶 -- 分桶只能是一个字段. create table student(id int,name string,sex int) clustered by(id) sorted by(id DESC) into 4 buckets row format delimited fields terminated by ',';查看分桶信息
desc formatted 表名
相关配置
hive-site.xml
#让hive强制分桶,自动按照分桶表的bucket进行分桶 推荐使用 hive.enforce.bucketing : true; #手动指定reduce数量,reduce数量也就是分桶数量,在没有设置分桶数量的时候默认的值 mapreduce.job.reduces : num; #注意 hive.enforce.bucketing为true时,reduce要设为-1; hive.enforce.bucketing为false时,reduce要设为和分桶数一致; 如果bucketing为 true,reduce又设成大于1的输,会执行两个job。Insert Data
分桶的实质就是对 分桶字段做了hash,然后跟分桶数取余,已决定放入到哪个桶里(或者叫文件中[email protected]).
所以说如果原有数据没有按key hash ,需要在插入分桶的时候hash.同理通过load添加的数据是无法进行分桶的,因为没有进行key hash以及取余
hive.enforce.bucketing:true在这种情况下我们可以直接使用hive所支持的insert方式进行数据插入
hive.enforce.bucketing:false即设置了mapreduce.job.reduces:数字时.则要求hive所支持的insert后的select 中加入
增加增加CLUSTER BY 语句.因为插入的数据我们需要决定放入到哪个桶中.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)