最近遇到的乙個工作任務。由於公司集群不支援使用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列表中的資料...