hive筆記:轉義字符的使用


hive中的轉義符

Hadoop和Hive都是用UTF-8編碼的,所以, 所有中文必須是UTF-8編碼, 才能正常使用

備注:中文數據load到表里面, 如果字符集不同,很有可能全是亂碼需要做轉碼的, 但是hive本身沒有函數來做這個

一、轉義字符的特殊情況:

自身的轉義,比如java有時候需要兩個轉義字符"\\",或者四個轉義字符“\\\\”。

1)java的倆種情況:

a.正則表達式匹配和string的split函數,這兩種情況中字符串包含轉義字符“\”時,需要先對轉義字符自身轉義,就是說需要兩個轉義字符“\\”。比如\n,\t等(java解析后,再有正則和split自身特定進行解析)

b.而當匹配字符正斜線“\”,則需要四個轉義字符“\\\\”,因為,首先java(編譯器?)自身先解析,轉義成兩個“\\”,再由正則或split的解析功能轉義成一個“\”,才是最終要處理的字符。

這是因為解析過程需要兩次,才能在字符串中出現正斜線“\”,出現后才能轉義后面的字符。

2)hive中的split和正則表達式

hive用java寫的,所以同Java一樣,兩種情況也需要兩個“\\”,

split處理代碼為例:

a.split(dealid,'\\\\')[0] as dealids,1: 代碼中,如果以“\”作為分隔符的話,那么就需要4個轉義字符“\\\\”,即

b.split(all,'~') :這里切分符號是正則表達式,按一個字符分隔沒問題 

c. split(all,'[|~]+'): 在[]內部拼接成字符串

3hive語句在shell腳本中執行 

shell語言也有轉義字符,自身直接處理。 
而hive語句在shell腳本中執行時,就需要先由shell轉義后,再由hive處理。這個過程又造成二次轉義。 
如上面的hive語句寫入shell腳本中,執行是錯誤的,shell先解析,轉義成”|“后傳給hive,hive解析這個轉義字符后,split就無法正確的解析了。 
所以,注意hive語句在shell腳本執行時,轉義字符需要翻倍。hive處理的是shell轉義后的語句,必須轉以后正確,才能執行。

注意:是否使用轉義字符是看這個字符在這個語言中有沒有特殊意義,有的話,就需要加上\來進行轉義、

 

轉義字符的使用:

轉義字符

無轉義符

轉義符\

轉義符\\

轉義符\\\

"

"

\"

\\”

 

\

不可識別 

不可識別 

不可識別 

\\\\

/

/

\/

\\/

\\\/

'

不可識別 

\'

不可識別  

\\\'

~

~

\~

\\~

 

|

|

\|

\\|

\\\|

;

;

\;

\\;

 

:

:

\:

\\:

 

,

,

\,

\\,

 

.

.

\.

\\.

 

!

!

\!

\\!

 

(

(

\(

\\(

 

)

)

\)

\\)

 

[

不可識別 

不可識別

\\[

 

]

]

\]

\\]

 

{

{

\{'

\\{

 

}

}

\}

\\}

 

?

?

\?

\\?

 

_

_

\_

\\_

 

-

-

\-

\\-

 

#

#

\#

\\#

 

##

##

\##

\\##

\\\##

&

&

\&

\\&

 

^

^

\^

\\^

 

 

二、案例:原數據表

1.\符號

(1)regexp_replace(dealids,'\\[','\\\\')

%jdbc(hive)

Select regexp_replace(dealids,'\\[','\\\\') as place

 From temp.track_join_rtq_freq_20181029

limit 10

 

 注意:

 

2.[與]符號

(1)\\[:split(dealids,'\\[')

%jdbc(hive)

Select split(dealids,'\\[') as place

 From temp.track_join_rtq_freq_20181029

limit 10

 

(2)]:split(dealids,']')

%jdbc(hive)

Select split(dealids,']') as place

 From temp.track_join_rtq_freq_20181029

limit 10

(3)\\[和[]:regexp_replace(dealids,'\\[','[]')

%jdbc(hive)

Select regexp_replace(dealids,'\\[','[]') as place

  From temp.track_join_rtq_freq_20181029

limit 10

 

 

(4)\\[和\\{}:regexp_replace(dealids,'\\[','\\{}')

%jdbc(hive)

Select regexp_replace(dealids,'\\[','\\{}') as place

 From temp.track_join_rtq_freq_20181029

limit 10

 

 

3.’符號

(1)\\\':regexp_replace(dealids,'\\[','\\\'')

%jdbc(hive)

Select regexp_replace(dealids,'\\[','\\\'') as place

  From temp.track_join_rtq_freq_20181029

limit 10

 

 

 


免責聲明!

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



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