Hive分区表和分桶表

1. 分区表

      1.1 概念

       Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。

       分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。

       分区表又分为静态分区表和动态分区表两种。

       这里说明一下分区表并 Hive 独有的概念,实际上这个概念非常常见。比如在我们常用的 Oracle 数据库中,当表中的数据量不断增大,查询数据的速度就会下降,这时也可以对表进行分区。表进行分区后,

       逻辑上表仍然是一张完整的表,只是将表中的数据存放到多个表空间(物理文件上),这样查询数据时,就不必要每次都扫描整张表,从而提升查询性能。

      1.2 使用场景

       通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。

      1.3 静态分区与动态分区

        所谓的静态分区表,指的就是我们在创建表的时候,就已经给该表创建好分区,在加载数据时放入到对应的分区。

        所谓的动态分区表,与静态分区的区别是载入的时候,我们事先并不知道该条数据属于属于哪个分区,而是需要hive自己去判断,并将该条数据加载到对应的目录中去。

        通常我们在生产环境上使用第二种。启用hive动态分区时,需要设置如下两个参数    

        set hive.exec.dynamic.partition=true;
        set hive.exec.dynamic.partition.mode=nonstrict;

      1.4 创建分区表

        在 Hive 中可以使用 PARTITIONED BY 子句创建分区表。表可以包含一个或多个分区列,程序会为分区列中的每个不同值组合创建单独的数据目录。   

        CREATE TABLE order_detail_partition(
                 id BIGINT,
                 order_no STRING,
                 create_time STRING
        ) PARTITIONED BY (create_date STRING)
       STORED AS PARQUET TBLPROPERTIES ('parquet.compression' = 'SNAPPY' );

2. 分桶表

     2.1 概念

      分桶表是一种更加细颗粒度数据拆分方案,分桶表会将指定列的值进行哈希散列,并对 bucket(桶数量)取余,然后存储到对应的 bucket(桶)中。

     2.2 理解分桶表

      

      单从概念上理解分桶表可能会比较晦涩,其实和分区一样,分桶这个概念同样不是 Hive 独有的,和Java数据结构中的 HashMap 的分桶概念是一致的。当调用 HashMap 的 put() 方法存储数据时,

      程序会先对 key 值调用 hashCode() 方法计算出 hashcode,然后对数组长度取模计算出 index,最后将数据存储在数组 index 位置的链表上,下图为 HashMap 的数据结构图:

     

     2.3 创建分桶表

      在 Hive 中,我们可以通过 CLUSTERED BY 指定分桶列,并通过 SORTED BY 指定桶中数据的排序参考列    

      CREATE TABLE order_detail_partition(
               id BIGINT,
               order_no STRING,
               create_time STRING
      ) PARTITIONED BY (create_date STRING)
        CLUSTERED BY(order_no) SORTED BY(order_no ASC) INTO 4 BUCKETS
        STORED AS PARQUET TBLPROPERTIES ('parquet.compression' = 'SNAPPY' );

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值