使用hive表的过程中经常需要一些便捷操作:
一、hdfs文件批量写SUCCESS文件,一般来说hive表生成结束,会产生一个_SUCCESS文件判断数据是否正常刷新完成
但是如果是动态分区插入表进行写文件,那么写_SUCCESS文件需要批量写到各个动态分区内。
可以使用以下代码片段在脚本结尾进行判断:
#遍历目标文件目录,awk获取文件路径
for file in `HADOOP_HOME/bin/hadoop fs -ls $path | awk '{print $8}'`
do
#检查文件是否有数据写入
line_num=`$HADOOP_HOME/bin/hadoop fs -du -s $file | tail -1 | awk '{print $1}'`
if [[ $line_num -eq 0 ]]
then
echo "FATAL $V_PATH_DIR is empty"
else
echo "NOTICE success"
#创建_SUCCESS文件
$HADOOP_HOME/bin/hadoop fs -touchz $file /_SUCCESS
fi
二、hdfs文件批量添加||恢复分区
1、执行命令快速恢复
MSCK REPAIR TABLE $tablename
2、写个shell脚本进行遍历循环恢复
# !/bin/bash
start_dt=$1
end_dt=$2
level=$3
table=$4
filepath=$5
#获取日期差
diff_days=$(((`date -d "${end_dt}" +%s` - `date -d "${start_dt}" +%s`)/3600/24))
#循环遍历日期写分区
for i in `seq 0 ${diff_days}`;
do
dt=`date -d "${i} days ${start_dt}" +%Y%m%d`
# echo "hadoop fs -touchz ${filepath}/${level}/${table}/dt=${dt}/_SUCCESS"
# hadoop fs -touchz ${filepath}/${level}/${table}/dt=${dt}/_SUCCESS
echo "ALTER TABLE ${table} ADD PARTITION (dt=${dt}) location '${filepath}/${level}/${table}/dt=${dt}' "
done
三、批量执行shell脚本跑hive数据
#! /bin/sh
#按照 日期范围进行批量执行hive脚本
tablename=$1
date=`date -d "+0 day $2" +%Y%m%d`
enddate=`date -d "+0 day $3" +%Y%m%d`
echo "date=$date"
echo "enddate=$enddate"
while [[ $date < $enddate ]]
do
echo $date
echo "using sourcing"
#执行引用shell脚本文件
source ./$tablename.sh $date
echo "done...."$date
date=`date -d "+1 day $date" +%Y%m%d`
done
月初执行脚本
#!/bin/sh
tablename=$1
date=`date -d "+0 day $2" +%Y%m%d`
enddate=`date -d "+0 day $3" +%Y%m%d`
echo "date=$date"
echo "enddate=$enddate"
while [[ $date < $enddate ]]
do
echo $date
day=`date -d "0 day ago $date" +%d`
if [ $day = 01 ];
then
echo "月初开始执行"
echo "using sourcing"
source ./$tablename.sh $date
echo "done...."$date
else
echo "不是月初不执行!!!"
fi
date=`date -d "+1 day $date" +%Y%m%d`
done
PS: hive动态分区处理表数据需要设置参数
set hive.exec.dynamic.partition=true; 设置是否可动态分区
set hive.exec.dynamic.partition.mode=nonstrict; 设置为非严格模式
set hive.exec.max.dynamic.partitions=1000; 处理的最大动态分区数
set hive.exec.max.dynamic.partitions.pernode=100; 在每一个mapper/reducer节点允许创建的最大分区数