简介
我们有一批日志数据存储在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