Hive表(分区和分桶)

8 篇文章 0 订阅
4 篇文章 0 订阅

Hive分区

  • 描述: Hive分区根据某字段的值分区
    1.可以多维度分区
    2.分区不会影响大范围查询的执行效率
    3.每个分区为一个目录
    4.分区下可继续分区或者分桶
  • 优点:限制在某个或者某些区间的值查询,处理速度会非常快
  • 创建分区执行语句:PARTITIONED BY
    • 例:创建日志表,按照dt与country分区
 CREATE TABLE logs(ts bigint,
                   line string) 
 PARTITIONED BY(dt string,country string)
  • 数据加载到分区表时,要显性指定分区值:
LOAD DATA LOCAL INPATH 'input/hive/partitions/file1'
INTO TABLE logs
PARTITION (dt='2001-01-01',country='GB')
  • 查看Hive中数据有哪些分区
hive > SHOW PARTITIONS logs;

Hive分桶

  • 描述:将数据按桶的方式放入不同的桶中(按照某列值的hash计算,除以桶的个数取余,余数相同的在一个桶)
  • 优点:
    • 取样更高效:在处理大规模数据时,在开发和查询阶段,在桶内试运行和查询一小段数据,可以方便很多
    • 获取更高的查询效率:桶为表加上了额外的数据结构,具体而言就连接两个相同
      列上划分桶的表,可以使用map端进行连接(map_side_join)高效实现,处理左
      边表某个桶的mapper就知道,右边表桶内相匹配行对应的桶
      ,两边表桶的个数不一定要一样,倍数也行
    • 桶可以根据一个或者多个列进行排序,这样对每个桶的连接就相当于一个归并排
      序,进一步提升了map的效率
  • 创建桶执行的语句:使用CLUSTERED BY (列) INTO 桶数 BUCKETS
CREATE TABLE user (
                    id INT ,
                    name STRING,
                    age INT
                             ) 
CLUSTERED BY (id) INTO 4 BUCKETS ;
  • 创建桶时对桶进行排序:
CREATE TABLE user (
                    id INT ,
                    name STRING,
                    age INT
                             ) 
CLUSTERED BY(id) SORTED BY (id ASC)  INTO 4 BUCKETS;
  • 向分桶后的表添加数据
    将hive.enforce.bucjeting属性设置为true。这样hive就知道用表定义中的声明创建桶
INSERT OVERWRITE TABLE user
SELECT * FROM data

后续的还会遇到坑还会继续添加

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值