hive 学习笔记之四:分区表
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)
创建名为 009.txt 的文本文件,内容如下,可见每行只有 name 和 age 两个字段,用来分区的 city 字段不在这里设置,而是在执行导入命令的时候设置,稍后就会见到:
tom,11
jerry,12
导入数据的命令如下,可见导入命令中制定了 city 字段,也就是说一次导入的所有数据,city 字段值都是同一个:
load data
local inpath '/home/hadoop/temp/202010/25/009.txt'
into table t9
partition(city='shenzhen');
再执行一次导入操作,命令如下,city 的值从前面的 shenzhen 改为 guangzhou:
load data
local inpath '/home/hadoop/temp/202010/25/009.txt'
into table t9
partition(city='guangzhou');
查询数据,可见一共四条数据,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)
前面曾提到分区实际上是不同的子目录,来看一下是不是如此,如下图,红框是 t9 的文件目录,下面有两个子目录 city=guangzhou 和 city=shenzhen:
查看子目录里面文件的内容,可见每条记录只有 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]$
以上就是以单个字段做静态分区的实践,接下来尝试多字段分区;
[](()静态分区(多字段分区)
新建名为 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 值建立二级子目录,图示如下:
第一次导入,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;
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)
查看 hdfs 文件夹,如下图,一级目录是 province 字段的值:
打开一个一级目录,如下图,可见二级目录是 city 的值:
查看数据:
[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t10/province=shanxi/city=hanzhong/009.txt
tom,11
jerry,12
以上就是静态分区的基本操作,可见静态分区有个不便之处:新增数据的时候要针对每一个分区单独使用 load 命令去操作,这时候使用动态分区来解决这个麻烦;
[](()动态分区
动态分区的特点就是不用指定分区目录,由 hive 自己选择;
执行以下命令开启动态分区功能:
评论