当前位置:   article > 正文

hive创建表和增加表分区的两种方式_hive表增加分区

hive表增加分区

hive表增加分区的两种方式


第一种方式:load data local inpath
注意点:
1.必须是本地文件,不能是集群上的文件
2.文件路径中的变量如果无法替换,可以把单引号换成双引号,一般双引号总是没问题的

3.hive库在配置的时候有一个hdfs基础路径,用这种方式创建的表时可以不指定hdfs路径,导入数据后会自然在“hdfs基础路径/表名/”下生成相应的分区文件夹
4.用desc formatted table_name;可以查看hdfs路径

# 加载数据的脚本如下

  1. #!/bin/sh
  2. if [[ $# -eq 1 ]];then
  3.     dt="${1}"
  4. else
  5.     echo "无输入时间,请传入一个时间参数给程序"
  6.     exit 1
  7. fi
  8. queryengine --sessionconf engine=wing -e"
  9. SET mapred.job.priority=VERY_HIGH;
  10. SET hive.merge.mapredfiles=true;
  11. SET hive.merge.size.per.task=536870912;
  12. SET hive.merge.smallfiles.avgsize=536870912;
  13. SET mapred.job.name=log_day_'${dt}';
  14. ADD FILE '/home/work/local/log_pretty/${dt}.log';
  15. load data local inpath '${dt}.log' overwrite INTO
  16.     TABLE default.log_day PARTITION (pdate = '${dt}');
  17. ;"
  18. if [[ $? -eq 0 ]];then
  19.     echo "数据入库正常........."
  20.     exit 0
  21. else
  22.     echo "数据入库出现异常.........."
  23.     exit 1
  24. fi


# 创建表的语句如下

  1. USE default;
  2. CREATE TABLE log_day (   
  3.     req_date                                STRING COMMENT '请求日期',
  4.     req_time                                STRING COMMENT '请求时间',
  5.     user_id                                 BIGINT COMMENT '用户id',
  6.     url                                     STRING COMMENT 'url',
  7.     module                                  STRING COMMENT '模块名',
  8.     operation                               STRING COMMENT '操作名',
  9.     task_id                                 BIGINT COMMENT '任务id'
  10. )
  11. COMMENT '清洗后的日志'
  12. PARTITIONED BY(pdate STRING)
  13. ROW FORMAT CHARSET 'UTF8'
  14. DELIMITED FIELDS TERMINATED BY '\001'
  15. LINES TERMINATED BY '\n'
  16. STORED AS TEXTFILE ;


第二种方式:创建外部表然后增加分区
注意点:
1. location的全路径是创建表时的hdfs路径加上location中指定的分区文件夹
2. 删除分区时不会删除hdfs数据

# 增加分区的脚本如下

  1. hour_interval=-1
  2. startday=`date "+%Y%m%d"`
  3. tmp_time=`date -d "$startday  $hour_interval days" "+%Y%m%d%H"`
  4. cur_date=${tmp_time:0:8}
  5. cur_hour=${tmp_time:8:2}
  6. while [ 1 ]
  7. do
  8.         hive -e "use default; ALTER TABLE detail_report ADD IF NOT EXISTS PARTITION (dt = $cur_date, hour = $cur_hour) location '$cur_date/$cur_hour';"
  9.         tmp_time=`date -d "$cur_date $cur_hour +1 hours" "+%Y%m%d%H"`
  10.         cur_date=${tmp_time:0:8}
  11.         cur_hour=${tmp_time:8:2}
  12.         tmp_time1=`date -d "+2 hours" "+%Y%m%d%H"`
  13.         cur_date1=${tmp_time1:0:8}
  14.         cur_hour1=${tmp_time1:8:2}
  15.         if [ $cur_date1 -eq $cur_date -a $cur_hour1 -eq $cur_hour ]
  16.         then
  17.                 sleep 3600
  18.         fi
  19. done

# 创建表的脚本如下

  1. use default;
  2. create EXTERNAL table
  3. IF NOT EXISTS hive_table_name (
  4. ac            string comment '',
  5. res_type      string comment '',
  6. install_date        string comment '',
  7. install_time        string comment '',
  8. ip                  string comment '',
  9. uid             string comment ''
  10. )
  11. COMMENT ''
  12. PARTITIONED BY(day STRING, hour STRING)
  13. ROW FORMAT DELIMITED
  14. FIELDS TERMINATED BY ','
  15. LOCATION 'hdfs://xx/xx/xx/hive_table_name';


hive常用语句
查看分区 show partitions table_name;
查看表详情 desc formatted table_name;
查看建表语句 show create table table_name;
删除分区 ALTER TABLE hive_cfp_install_report DROP IF EXISTS PARTITION (day='20181003');

下面提供一个批量删除分区的方式

  1. # 循环删除分区
  2. #!/bin/sh
  3. source /etc/profile
  4. startdate=`date -d $1 +"%Y%m%d"`
  5. tempdate=${startdate}
  6. enddate=`date -d $2 +"%Y%m%d"`
  7. # 将时间戳转成整数比大小
  8. while [ $((tempdate)) -le $((enddate)) ]
  9. do
  10.       echo $tempdate "start####" # 20180801
  11.       hive -e"
  12.       use default;
  13.       ALTER TABLE hive_report DROP IF EXISTS PARTITION (day='$tempdate');"
  14.       tempdate=`date -d "1 day $tempdate" +"%Y%m%d"` # 20180802
  15. done

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号