赞
踩
我们有一批日志数据存储在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://blog.csdn.net/weixin_33919941/article/details/88144880
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。