欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

hive笔记:转义字符的使用

程序员文章站 2024-01-18 10:51:10
hive中的转义符 Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用 备注:中文数据load到表里面, 如果字符集不同,很有可能全是乱码需要做转码的, 但是hive本身没有函数来做这个 一、转义字符的特殊情况: 自身的转义,比如java有时候需要两个 ......

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转义后的语句,必须转以后正确,才能执行。

注意:是否使用转义字符是看这个字符在这个语言中有没有特殊意义,有的话,就需要加上\来进行转义、

 

转义字符的使用:

转义字符

无转义符

转义符\

转义符\\

转义符\\\

"

"

\"

\\”

 

\

不可识别 

不可识别 

不可识别 

\\\\

/

/

\/

\\/

\\\/

'

不可识别 

\'

不可识别  

\\\'

~

~

\~

\\~

 

|

|

\|

\\|

\\\|

;

;

\;

\\;

 

:

:

\:

\\:

 

,

,

\,

\\,

 

.

.

\.

\\.

 

!

!

\!

\\!

 

(

(

\(

\\(

 

)

)

\)

\\)

 

[

不可识别 

不可识别

\\[

 

]

]

\]

\\]

 

{

{

\{'

\\{

 

}

}

\}

\\}

 

?

?

\?

\\?

 

_

_

\_

\\_

 

-

-

\-

\\-

 

#

#

\#

\\#

 

##

##

\##

\\##

\\\##

&

&

\&

\\&

 

^

^

\^

\\^

 

 

 

 

 

 

 

 

二、案例:原数据表

hive笔记:转义字符的使用

 

1.\符号

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

%jdbc(hive)

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

 from temp.track_join_rtq_freq_20181029

limit 10

hive笔记:转义字符的使用

 

 注意:

hive笔记:转义字符的使用

hive笔记:转义字符的使用

 

2.[与]符号

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

%jdbc(hive)

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

 from temp.track_join_rtq_freq_20181029

limit 10

 hive笔记:转义字符的使用

 

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

%jdbc(hive)

select split(dealids,']') as place

 from temp.track_join_rtq_freq_20181029

limit 10

hive笔记:转义字符的使用

 

 

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

%jdbc(hive)

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

  from temp.track_join_rtq_freq_20181029

limit 10

 hive笔记:转义字符的使用

 

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

%jdbc(hive)

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

 from temp.track_join_rtq_freq_20181029

limit 10

hive笔记:转义字符的使用

 

 

3.’符号

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

%jdbc(hive)

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

  from temp.track_join_rtq_freq_20181029

limit 10

 hive笔记:转义字符的使用