hive partition维护

在创建hive表时,可以指定分区,如下创建了一个按天、小时分区的表:

CREATE EXTERNAL TABLE `test`(
  `name` string,
  `uri` string,
  `reqMethod` string,
  `status` int) 
PARTITIONED by (
  `dt` string, 
  `hour` string) 
LOCATION '/data/test'

接下来,我们在hdfs上按照如下目录结构写入数据:

hadoop fs -ls /data/test/dt=2020-08-20/hour=09

写入数据后是无法通过sql从hive表中查询到数据的,因为分区信息没有添加到hive中。我们可以使用如下命令添加分区:

hive> alter table $TABLE add partition (dt ='2020-08-20',hour='09');

如果分区特别多,使用上面命令按个添加就非常麻烦,所以,可以使用如下命令一次添加完:

msck repair table test;

添加完分区后,我们就可以通过sql按照分区数据查hive表了。

可以通过如下命令查看分区信息:

hive> show partitions test;
OK
dt=2020-07-24/hour=00
...

另外,假设数据只需要保留3天,我们可以通过cron定时执行如下命令:

#!/bin/bash

if [ $# -eq 0 ];
then
	DT=`date -d"3 days ago" +'%F'`
else
	DT=$1
fi

hadoop fs -rm -r -skipTrash /data/test/flink/abc/dt=$DT

需要注意的是,通过上述命令在hdfs上直接删除了数据文件,这时再使用msck命令创建hive分区时,会出现如下提示:

hive> msck repair table test;
OK
Partitions missing from filesystem:	test:dt=2020-07-29/hour=00	test:dt=2020-07-29/hour=01	...
Time taken: 1.37 seconds, Fetched: 1 row(s)

原因是我们直接在hdfs上删除了数据文件,hive的meta信息中仍然保存了partition相关信息,而msck命令不会自动删除不存在数据的分区信息,只会添加分区信息。

在hive3.0中msck命令支持删除partition信息,例如:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]

 

你可能感兴趣的:(#,hive)