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