hive -e和hive -f的區別(轉)


 

大家都知道,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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM