当前位置:   article > 正文

Hive外表批量添加分区_hive add partition 多个分区数据

hive add partition 多个分区数据

简介

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

创建外表

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

添加数据

示例:

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

但是,看下文件列表

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

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

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

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

/data/logs/gateway/dt=20180731

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

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

这时,用命令

MSCK REPAIR TABLE gateway_analysis; 

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

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

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

  1. for path in `hdfs dfs -ls /data/logs/gateway | awk '{print $8}'`
  2. do
  3. hive --database dbname -e "alter table gateway_analysis add PARTITION(dt='${path:0-8:8}') location '$path'"
  4. done


原文:https://blog.csdn.net/weixin_33919941/article/details/88144880 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/692486
推荐阅读
相关标签
  

闽ICP备14008679号