相关知识点
shell的循环;shell连接hive-hive语句执行、hive文件执行;传参;输入输出文件,文件删除
shell中list的循环:
for line in ${list[@]} #这里不能只写${list},执行结果不对,回头测试一下
do
执行语句
done
shell中的判断:
result=$?
if [$result !=0 ]; then
执行语句
fi
cat配合重定向生成文件
cat << EOF >/path/filename # 也可以使用>>对文件进行追加
your content
EOF #顶格写
EOF只是一个分界符,当然也可以用abcde替换。
当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。
通过cat配合重定向能够生成文件并追加操作。
代码
代码一
场景:有一批平行的数据库db1, db2, db3, ...,每个库都有tb_name这张表,现在要对每个库的这张表执行查询操作,通过shell后台连接hive数据库可以批量处理
#!/bin/bash
db_list=("db1" "db2" "db3" "db4" "db5" "db6")
hive_url='jdbc:hive2://...;principal=hive/...' #通过jdbc连接hive
for db in ${db_list[@]}
do
echo "${db}"
beeline -u "${hive_url}" --silent=false -hivevar db=$db -e "hivesql查询语句,eg: select * from ${db}.tb_name limit 1"
done #这里silent静默模式若设置为True,会省略MR日志
#判断上一条是否成功
result=$?
if [$result !=0 ]; then
echo "---------------错误码:status:$result--------------------------"
fi
将hivesql放在文件中,用文件方式操作
#这里文件通过循环追加文本存储的是参数还是参数值? ——是参数值
#!/bin/bash
db_list=("db1" "db2" "db3" "db4" "db5" "db6")
path=/home/luxia
for db in ${db_list[@]}
do
cat <<EOF >>${path}/tmp.hql
select * from ${db}.tb_name;
EOF
done
>cat tmp.hql
select * from db1.tb_name;
select * from db2.tb_name;
select * from db3.tb_name;
select * from db4.tb_name;
select * from db5.tb_name;
select * from db6.tb_name;
代码二
#!/bin/bash
path=/home/username/...
db_list=("db1" "db2" "db3" "db4" "db5" "db6")
hive_url='jdbc:hive2://...;principal=hive/...' #通过jdbc连接hive
db_list=("db1" "db2" "db3" "db4" "db5" "db6")
for db in ${db_list[@]}
do
cat <<EOF >>${path}/tmp.hql
select * from ${db}.tb_name;
EOF
done #循环拼接sql
hql=${path}/tmp.hql
beeline -u "${hive_url}" --silent=false [-hivevar var1=${var1}] -f $hql #文件调用
rm -f $hql