实例演示hive的静态分区和动态分区

Hive分区(Partition)

分区主要用于提高性能
分区列的值将表划分为一个个的文件夹
查询时语法使用"分区"列和常规列类似
查询时Hive会只从指定分区查询数据,提高查询效率
注:
由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。
分为静态分区和动态分区
示例演示

一、静态分区

创建数据,准备用性别分区
在这里插入图片描述
打开hive创建表

hive> create table userinfo(
    > userid string,
    > username string,
    > brithday string
    > )
    > partitioned by (sex string)
    > row format delimited fields terminated by ','
    > stored as textfile;
    OK
Time taken: 0.247 seconds
hive> desc userinfo;     //查看表结构
OK
userid                  string
username                string
brithday                string
sex                     string

# Partition Information     //分区信息
# col_name              data_type               comment

sex                     string

用load直接传输数据并用静态分区(错误)

hive> load data local inpath '/opt/software/info.csv' overwrite into table userinfo partition (sex='male');

在这里插入图片描述
注意
这里会存在问题,这里并不是真正的分区,而是强行把所有数据传入分区,并把对应的属性在展示时全改为分区的属性,而实际属性未发生改变。在hdfs上查询文件,其真实内容如下图
在这里插入图片描述

删除表数据重新开始

先在hdfs上创建文件夹,存放数据文件

hive> !hdfs dfs -mkdir -p /wh;
hive> !hdfs dfs -put /opt/software/info.csv /wh;

创建原始表存放数据,路径为刚刚上传地址

hive> create table ods_user (
    > userid string,
    > username string,
    > brithday string,
    > sex string
    > )
    > row format delimited fields terminated by ','
    > location '/wh'
    > ;

通过这张表向分区表中插入数据
在插入数据时注意 ,后面select中不要将分区的属性也查询插入。按照分区的属性分别插入

hive> insert into userinfo partition(sex='male') select userid,username,brithday from ods_user where sex='male';
hive> insert into userinfo partition(sex='female') select userid,username,brithday from ods_user where sex='female';

插入结束后可以查看网页192.168.73.39:50070页面
在这里插入图片描述

二、动态分区

如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区都要写一个insert语句,在某些场景下还是比较麻烦。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
创建表

hive> create table myusers(
    > userid string,
    > username string,
    > brithday string
    > )
    > partitioned by (sex string)
    > row format delimited fields terminated by ','
    > stored as textfile;

使用动态分区需设定属性

hive> set hive.exec.dynamic.partition=true;    //开启
hive> set hive.exec.dynamic.partition.mode=nonstrict;      //设置分区模式为非严格模式

从原始表中直接插入数据

hive> insert into myusers partition(sex) select * from ods_user;

成功显示,可以看出它直接根据sex的两个属性自动分区
在这里插入图片描述
网页显示
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值