shell指令碼的方式批量匯出hive建表語句

2021-09-13 10:10:33 字數 1642 閱讀 9981

最近遇到的乙個工作任務。由於公司集群不支援使用hive命令,只能使用beeline命令。

通過beeline -e  或 beeline -f 匯出的結果,會包含一些其他多餘的資訊,不好過濾。

同時beeline -e 只能跟一條sql語句。

於是使用spark-sql來完成指令碼編寫。

第一版

spark-sql -e "use test ; show tables;" > tables.txt

cat tables.txt | awk '' |while read eachline

#由於用spark-sql查詢出的表資訊包含三列,分別是庫名 表名 false  用awk篩選出第二列的表名。

dospark-sql -e "use test ; show create table $eachline;" >>tablesddl.sql

echo ";" >> tablesddl.sql

#在每條建表語句後追加分號,以便用於批量建表。

done

問題:執行速度非常慢,每迴圈一次,就會啟停一次spark-sql客戶端,浪費時間和集群資源。

優化執行指令碼:

將迴圈產生的查詢建表語句的sql先重定向到txt檔案中,再使用spark-sql -f sql檔案 的方式。

就只需要啟動一次spark-sql客戶端。

spark-sql -e "use $1 ; show tables;" > tables.txt

cat tables.txt | awk '' |while read eachline

do  echo "show create table $1.$eachline;" >>createtable.hql

done

#kinit -kt **** ****  

spark-sql -f createtable.hql > tablesddl.hql

產生乙個新的問題:每條建表語句間的分號就只能手動新增了???

於是,想到了用sed -i "s/^)$/);/g" 去匹配每條sql語句結束的)並替換為);。

但是發現我想多了,仔細檢視sql語句,並不是只有每條sql語句結束了的最後單行為),在中間還有一處也是

單行乙個).

怎麼辦呢? 想了半天,又想到一種方法可行。觀察了各建表語句,發現了一條規律就是,

每條語句結束的上一行都是'numrows' = '-1'。於是可以利用sed命令列印出匹配該內容的行數,

然後再利用awk的演算法運算去+1行,就得到了每條建表語句結束的那一行的行數,最後再用sed -i去匹配替換指定的行的內容。

搞定收工。

sed -n -e "/'numrows' = '-1'/="  tablesddl.hql | awk '' | while read line

do sed -i "$s/)/);/g" tablesddl.hql

done

雖然這只是乙個簡單的指令碼,但發現了一些問題,就應該去一步步地思考如何解決。

這最重要的還是這種思考問題解決問題的思維方式。加油!!!

shell 編寫指令碼批量ping ip

伺服器總是一下子買了很多的段的ip。通過繫結後,也不知道這些ip是否繫結成功,所以就寫了乙個shell指令碼,把ip輸好,批量ping一下,看是不是都能ping通。指令碼如下 此外。還有乙個ip檔案,裡面放的都是ip 名為allip 我們來執行一下,看一下結果 除了8.8.他顯示 ping 其他 失...

shell指令碼批量新增使用者

shell指令碼 shell 是命令直譯器 檢視當前系統支援的shell型別 cat etc shells 檢視當前使用shell echo shell 使用者新增 useradd 引數 名字 e 指定使用者失效時間 c 新增使用者備註 在 etc passwd第五字段 d 指定使用者家目錄 使用者...

Shell指令碼 批量建立使用者

格式為 使用者名稱 空格 tab 密碼 就是將資料分為兩列 users.txt文字內容示例 新建文字命令 touch create users.sh 編譯文字命令 vim create users.sh bin bash 批量建立使用者 while read line do 讀取line列表中的資料...