一、脚本内容
#!/bin/bash
. /etc/profile
. ~/.bash_profile
# 报错退出
error() {
if [[ $? != 0 ]]; then
echo "$@ 运行失败"
#事务回滚机制
sh ~/bee_u_e.sh "drop table if exists tmp.nidaye_${pt}"
exit 1
fi
}
#脚本使用说明
if [[ $1 = help ]];then
echo "传入参数 表名 +文件名 +要屏蔽的字段名(多个|分割),无需屏蔽参数可设空"
echo "此脚本仅用于下载\t 分隔带表头文件-- 通过hdfs方式,适合于大数据量下载"
exit 0
fi
res_table=$1 # 要下载 表名
file_name=$2 # 要下载的文件名
drop_field=$3 # 多个字段 | 分割 ,可为空 -- 要屏蔽字段
pt=`date +%s`
echo "${head_table_sed}"
#
hive -e "
set hive.support.quoted.identifiers=None;
alter view tmp.td_mid_view as select \`(${drop_field})?+.+\` from ${res_table};
create table tmp.nidaye_${pt} ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS textfile as select * from tmp.td_mid_view "
error "建表失败"
echo "建表完成"
mid_table="tmp.nidaye_${pt}"
mid_table_hdfs="nidaye_${pt}"
# 设置视图方式控制要屏蔽字段
sql="
set hive.resultset.use.unique.column.names=false;
set hive.cli.print.current.db=true;
set hive.support.quoted.identifiers=None;
select \`(${drop_field})?+.+\` from ${mid_table} limit 0
"
# 下载表头
hive -e "$sql"|sed "s/${mid_table_hdfs}.//g"|sed 's/NULL|\\\\N//g' > ${file_name}
error "下载失败"
echo "表头下载成功"
# 下载数据内容
hadoop fs -cat /user/hive/warehouse/tmp.db/${mid_table_hdfs}/*|sed -r "s/NULL|\\\\N//g" >> ${file_name}
error "数据内容下载失败"
# 善后处理
sh ~/bee_u_e.sh "drop table if exists tmp.nidaye_${pt}"
error "清理表失败"
echo "所有参数 $@ : 需清理表:${mid_table}"
二、使用方法
- 保存
ESC+wq!
- 赋权
chmod 775 down_test.sh
- 执行
down_test.sh "hive表名" "文件名" "需要屏蔽的表字段(a|b|c)"
网友评论