hive 中\\使用的注意事項

hive -f 後面指定的是一個文件,然後文件裏面直接寫sql,就可以運行hive的sql,hive -e 後面是直接用雙引號拼接hivesql,然後就可以執行命令。

但是,有這麼一個東西,我的sql當中有一個split切割,暫且先不管這個分割的業務邏輯是什麼,但是當中有一段是用小數點(.)來分割字符串的,因爲小數點是一個比較特殊的符號,所以前面要加上兩個反斜槓來代表這是一個單純的小數點(.),那麼問題就來了!!

當我手動執行hive的時候,我是通過hive -f 執行的,得到的結果數據大約有5000W條,然而我把一樣的sql放到kettle中執行(注:kettle中我不願意在服務器的某個地方寫個文件來存放sql,這樣後面的人也不好維護,還要去服務器上看我的sql文本,所以kettle中我直接hive -e 執行),結果我發現kettle出來的數據只有50W,你說滑稽不滑稽。。。。

經過折磨,最後在同事的幫助下,我們發現,hive -e "要執行的sql",這種在引號裏面使用2個反斜槓,會出現問題,具體什麼問題,我還說不太清楚,但是雙引號裏面用2個反斜槓確實是會有些衝突(因爲hive -f 沒有使用到雙引號,應該是把這個文本直接傳入到hive的類當中,所以沒有這樣的問題)

因此使用hive -e "要執行的sql" 這種方式跑數據,千萬千萬看看有沒有反斜槓,多關注下反斜槓和雙引號是否會衝突,這裏我測出來,如果要使用 \\ ,就要替換成\\\\

所以:

 select split(split(split(url,'/')[size(split(url,'/'))-1],'\\.')[0],'~')[0]

需要替換成

 select split(split(split(url,'/')[size(split(url,'/'))-1],'\\\\.')[0],'~')[0]

這樣就沒有問題了!F***K~

最後總結下:如果你在hive中直接執行該命令,那麼就只能有\\否則不生效,如果是hive -e(或者說sql命令外面有雙引號引起來的),那麼就需要用\\\\

--------------------- 本文來自 lsr40 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/lsr40/article/details/81566424?utm_source=copy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章