Hive外表批量添加分区

简介

我们有一批日志数据存储在hdfs上,按天创建目录,如2018-07-31的日志hdfs路径为:/data/logs/gateway/20180731。
现在要用hive分析数据,同时要保证这些数据目录不能改变,就需要hive用外表的方式与这些数据进行关联。

创建外表

CREATE EXTERNAL TABLE `gateway_analysis`(
  `s_t` bigint, 
  `u_i` string
)
PARTITIONED BY ( `dt` string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' ;

添加数据

示例:

ALTER TABLE eqxdb.gateway_analysis ADD PARTITION (dt='20180422') LOCATION '/data/logs/gateway/20180422';

但是,看下文件列表

$ hadoop fs -ls /data/logs/gateway
Found 108 items
drwxr-xr-x   - hdfs supergroup          0 2018-04-13 18:50 /data/logs/gateway/20180413
drwxr-xr-x   - hdfs supergroup          0 2018-04-17 00:00 /data/logs/gateway/20180416
drwxr-xr-x   - hdfs supergroup          0 2018-04-18 00:00 /data/logs/gateway/20180417
drwxr-xr-x   - hdfs supergroup          0 2018-04-19 00:00 /data/logs/gateway/20180418
...

一共108个待添加的目录,这样一个个添加太累人,有没有批量添加的方法呢?

Hive有个MSCK命令,可以扫描数据分区目录,修复元信息,目录与元信息不一致时,能自动更新。

但是,数据目录必须是Hive习惯路径格式:

/data/logs/gateway/dt=20180731

同时,建表时指定LOCATION为分区目录的父目录:

CREATE EXTERNAL TABLE `gateway_analysis`(
  `s_t` bigint, 
  `u_i` string
)
PARTITIONED BY ( `dt` string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION '/data/logs/gateway/';

这时,用命令

MSCK REPAIR TABLE gateway_analysis; 

即可自动把所有的数据按dt分区,添加到gateway_analysis中。

由于我们的目录格式不符合,只能用ADD PARTITION的方式了。

为减少工作量,写了个shell脚本,自动添加/data/logs/gateway目录下所有的分区目录到gateway_analysis表中:

for path in `hdfs dfs -ls /data/logs/gateway | awk '{print $8}'`
do
    hive --database dbname -e "alter table gateway_analysis add PARTITION(dt='${path:0-8:8}') location '$path'"
done
    原文作者:小琪的大爷
    原文地址: https://www.jianshu.com/p/4eec06fa56bc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞