hive-shell批量操作分区文件

浏览: 4405

使用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节点允许创建的最大分区数
推荐 0
本文由 brucelu 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册