Hive表

作者: 焱三土 | 来源:发表于2019-04-03 14:25 被阅读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

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

相关文章

网友评论

      本文标题:Hive表

      本文链接:https://www.haomeiwen.com/subject/wisgbqtx.html