1. 程式人生 > 實用技巧 >shell實操1-在shell指令碼內連線hive做sql查詢

shell實操1-在shell指令碼內連線hive做sql查詢

相關知識點

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 #判斷上一條是否成功 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