hive学习笔记之四:分区表

欢迎访问我的GitHub
内容:所有原创文章分类和汇总 , 及配套源码 , 涉及Java、Docker、Kubernetes、DevOPS等;
本篇概览本文是《hive学习笔记》系列的第四篇 , 要学习的是hive的分区表 , 简单来说hive的分区就是创建层级目录的一种方式 , 处于同一分区的记录其实就是数据在同一个子目录下 , 分区一共有两种:静态和动态 , 接下来逐一尝试;
静态分区(单字段分区)先尝试用单个字段分区 , t9表有三个字段:名称city、年龄age、城市city , 以城市作为分区字段:

  1. 建表:
create table t9 (name string, age int) partitioned by (city string)row format delimited fields terminated by ',';
  1. 查看:
hive> desc t9;OKnamestringageintcitystring# Partition Information# col_namedata_typecommentcitystringTime taken: 0.159 seconds, Fetched: 8 row(s)
  1. 创建名为009.txt的文本文件 , 内容如下 , 可见每行只有name和age两个字段 , 用来分区的city字段不在这里设置 , 而是在执行导入命令的时候设置 , 稍后就会见到:
tom,11jerry,12
  1. 导入数据的命令如下 , 可见导入命令中制定了city字段 , 也就是说一次导入的所有数据 , city字段值都是同一个:
【hive学习笔记之四:分区表】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;OKt9.name t9.age t9.citytom 11 guangzhoujerry 12 guangzhoutom 11 shenzhenjerry 12 shenzhenTime taken: 0.104 seconds, Fetched: 4 row(s)
  1. 前面曾提到分区实际上是不同的子目录 , 来看一下是不是如此 , 如下图 , 红框是t9的文件目录 , 下面有两个子目录city=guangzhou和city=shenzhen:

hive学习笔记之四:分区表文章插图
  1. 查看子目录里面文件的内容 , 可见每条记录只有name和age两个字段:
[hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/t9/city=guangzhouFound 1 items-rwxr-xr-x3 hadoop supergroup16 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.txttom,11jerry,12[hadoop@node0 bin]$以上就是以单个字段做静态分区的实践 , 接下来尝试多字段分区;
静态分区(多字段分区)
  • 新建名为t10的表 , 有两个分区字段:province和city , 建表语句:
create table t10 (name string, age int) partitioned by (province string, city string)row format delimited fields terminated by ',';
  • 上述建表语句中 , 分区字段province写在了city前面 , 这就意味着第一级子目录是province值 , 每个province子目录下面再按照city值建立二级子目录 , 图示如下:

hive学习笔记之四:分区表文章插图
  • 第一次导入 , province=‘shanxi’, city=‘xian’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='shanxi', city='xian');
  • 第二次导入 , province=‘shanxi’, city=‘xian’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='shanxi', city='hanzhong');
  • 第三次导入 , province=‘guangdong’, city=‘guangzhou’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='guangdong', city='guangzhou');
  • 第四次导入 , province=‘guangdong’, city=‘shenzhen’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='guangdong', city='shenzhen');
  • 全部数据如下:
hive> select * from t10;OKt10.name t10.age t10.province t10.citytom 11 guangdong guangzhoujerry 12 guangdong guangzhoutom 11 guangdong shenzhenjerry 12 guangdong shenzhentom 11 shanxi hanzhongjerry 12 shanxi hanzhongtom 11 shanxi xianjerry 12 shanxi xianTime taken: 0.129 seconds, Fetched: 8 row(s)
  • 查看hdfs文件夹 , 如下图 , 一级目录是province字段的值:

hive学习笔记之四:分区表文章插图