写点什么

hive 学习笔记之四:分区表

  • 2022 年 5 月 04 日
  • 本文字数:1728 字

    阅读完需:约 6 分钟

hive> desc t9;


OK


name string


age int


city string

Partition Information

col_name data_type comment

city string


Time taken: 0.159 seconds, Fetched: 8 row(s)


  1. 创建名为 009.txt 的文本文件,内容如下,可见每行只有 name 和 age 两个字段,用来分区的 city 字段不在这里设置,而是在执行导入命令的时候设置,稍后就会见到:


tom,11


jerry,12


  1. 导入数据的命令如下,可见导入命令中制定了 city 字段,也就是说一次导入的所有数据,city 字段值都是同一个:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t9


partition(city='shenzhen');


  1. 再执行一次导入操作,命令如下,city 的值从前面的 shenzhen 改为 guangzhou:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t9


partition(city='guangzhou');


  1. 查询数据,可见一共四条数据,city 共有两个值:


hive> select * from t9;


OK


t9.name t9.age t9.city


tom 11 guangzhou


jerry 12 guangzhou


tom 11 shenzhen


jerry 12 shenzhen


Time taken: 0.104 seconds, Fetched: 4 row(s)


  1. 前面曾提到分区实际上是不同的子目录,来看一下是不是如此,如下图,红框是 t9 的文件目录,下面有两个子目录 city=guangzhou 和 city=shenzhen:



  1. 查看子目录里面文件的内容,可见每条记录只有 name 和 age 两个字段:


[hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/t9/city=guangzhou


Found 1 items


-rwxr-xr-x 3 hadoop supergroup 16 2020-10-31 16:47 /user/hive/warehouse/t9/city=guangzhou/009.txt


[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t9/city=guangzhou/009.txt


tom,11


jerry,12


[hadoop@node0 bin]$


以上就是以单个字段做静态分区的实践,接下来尝试多字段分区;

[](()静态分区(多字段分区)

  1. 新建名为 t10 的表,有两个分区字段:province 和 city,建表语句:


create table t10 (name string, age int)


partitioned by (province string, city string)


row format delimited


fields terminated by ',';


  1. 上述建表语句中,分区字段 province 写在了 city 前面,这就意味着第一级子目录是 province 值,每个 province 子目录,再按照 city 值建立二级子目录,图示如下:



  1. 第一次导入,province=‘shanxi’, city=‘xian’:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t10


partition(province='shanxi', city='xian');


  1. 第二次导入,province=‘shanxi’, city=‘xian’:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t10


partition(province='shanxi', city='hanzhong');


  1. 第三次导入,province=‘guangdong’, city=‘guangzhou’:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t10


partition(province='guangdong', city='guangzhou');


  1. 第四次导入,province=‘guangdong’, city=‘shenzhen’:


load data


local inpath '/home/hadoop/temp/202010/25/009.txt'


into table t10


partition(province='guangdong', city='shenzhen');


  1. 全部数据如下:


hive> select * from t10;


OK


t10.name t10.age t10.province t10.city


tom 11 guangdong guangzhou


jerry 12 guangdong guangzhou


tom 11 guangdong shenzhen


jerry 12 guangdong shenzhen


tom 11 shanxi hanzhong


jerry 12 shanxi hanzhong


tom 11 shanxi xian


jerry 12 shanxi xian


Time taken: 0.129 seco 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 nds, Fetched: 8 row(s)


  1. 查看 hdfs 文件夹,如下图,一级目录是 province 字段的值:



  1. 打开一个一级目录,如下图,可见二级目录是 city 的值:



  1. 查看数据:


[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t10/province=shanxi/city=hanzhong/009.txt


tom,11


jerry,12


  1. 以上就是静态分区的基本操作,可见静态分区有个不便之处:新增数据的时候要针对每一个分区单独使用 load 命令去操作,这时候使用动态分区来解决这个麻烦;

[](()动态分区

  1. 动态分区的特点就是不用指定分区目录,由 hive 自己选择;

  2. 执行以下命令开启动态分区功能:

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
hive学习笔记之四:分区表_Java_爱好编程进阶_InfoQ写作社区