目录
开启hive中分区表支持中文字段:
首先登录到mysql中:
mysql -uroot -p123456
进入hive表:
use hive;
修改hive database编码
alter database hive default character set utf8;
修改table编码
alter table PARTITIONS default character set utf8;
alter table PARTITION_KEY_VALS default character set utf8;
alter table SDS default character set utf8;
修改字段编码:
alter table PARTITIONS modify column PART_name varchar(190) character set utf8;
alter table PARTITION_KEY_VALS modify column PART_KEY_VAL varchar(256) character set utf8;
alter table SDS modify column LOCATION varchar(4000) character set utf8;
分区表操作
分区表与其他表的不同点:分区字段的值在hdfs中以表目录下的子目录形式保存下来的
格式为:分区字段=值
建表
建表语句:
CREATE TABLE IF NOT EXISTS learn2.partition_student(
id STRING COMMENT "学生ID",
name STRING COMMENT "学生姓名",
age int COMMENT "年龄",
gender STRING COMMENT "性别"
) PARTITIONED BY (clazz STRING COMMENT "班级")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;
由于加载的数据中是以逗号切分的,所以这里使用逗号作为分隔字符创建该表,分隔字符的确认在于所要向表中插入数据的内容决定。
结果:
分区表插入数据:
对分区表插入数据时,需要指明所插入的数据中的分区字段:
格式:load data local inpath "本地路径" into table 表名 PARTITION(分区字段 = 值)
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班.txt" into table learn2.partition_student PARTITION(clazz="文科一班");
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科二班.txt" into table learn2.partition_student PARTITION(clazz="文科二班");
查询表中内容的结果:
在hdfs中查看插入的数据所存放的位置:/user/hive/warehouse/learn2.db/partition_student
覆盖原先分区中的数据:
格式:load data local inpath "本地路径" overwrite into table 表名 PARTITION(分区字段 = 值)
覆盖文科一班的数据:
load data local inpath "/usr/local/soft/hive-3.1.2/data/新文科一班.txt" overwrite into table learn2.partition_student PARTITION(clazz="文科一班");
查询结果:
创建一个外部分区表:
CREATE EXTERNAL TABLE IF NOT EXISTS learn2.partition_student2(
id STRING COMMENT "学生id",
name STRING COMMENT "学生姓名",
age int COMMENT "年龄",
gender STRING COMMENT "性别"
) PARTITIONED BY (clazz STRING COMMENT "班级")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;
加载数据到表中:
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班.txt" into table learn2.partition_student2 PARTITION(clazz="文科一班");
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科二班.txt" into table learn2.partition_student2 PARTITION(clazz="文科二班");
结果:
查询分区:
格式:show partitions 表名;
举例:查询外部分区表partition_student2的分区:
show partitions partition_student2;
结果:
删除分区:
格式:alter table 表名 drop PARTITION(分区字段=值)
举例:删除外部表中的文科二班的分区
alter table learn2.partition_student2 drop PARTITION(clazz="文科二班");
结果:
由于创建的是外部表,所以在删除分区后只能删除hive中的元数据,存储在hdfs上的数据依然存在。
hdfs中查看: 但若是一个内部表,在删除分区时会将hive中和hdfs中的数据一并删除。
删除内部表partition_student中的分区文科二班:
alter table learn2.partition_student drop partition(clazz="文科二班");
结果:
在hdfs中相应的数据也被删除掉:
恢复分区:
格式:msck repair table 表名;
恢复刚刚删除的两个表的分区:
msck repair table learn2.partition_student;
msck repair table learn2.partition_student2;
结果:partition_student中的分区:
partition_student2中的分区:
结果发现:只有外部表可以恢复被删除的分区,内部表无法恢复被删除的分区
原因:外部表中的数据同数据存储位置无关,恢复分区时会自动扫描数据存储位置下的数据并重新加载到该表中。
强制删除分区(慎用):
格式:dfs -rmr hdfs路径
从hdfs中删除数据:
dfs -rmr /user/hive/warehouse/learn2.db/partition_student2/clazz=文科二班
添加分区:
格式:alter table 表名 add PARTITION(分区字段=值)
为partition_student2添加分区理科一班:
alter table learn2.partition_student2 add partition(clazz="理科一班");
结果:
通过-put上传数据到表中:
dfs -put /usr/local/soft/hive-3.1.2/data/理科一班.txt /user/hive/warehouse/learn2.db/partition_student2/clazz=理科一班/;
查看结果:
增加动态分区操作
set hive.exec.dynamic.partition=true; 设置开启动态分区
set hive.exec.dynamic.partition.mode=nostrict; 设置动态分区的模式为非严格模式
set hive.exec.max.dynamic.partitions.pernode=1000; 设置分区的最大分区数
在hive中执行上述步骤: