impala substr无法正确获取utf8字符

c0vxltue  于 2021-07-13  发布在  Hadoop
关注(0)|答案(1)|浏览(621)

我是etl的新手,我被分配了一项任务,在将数据提供给客户机之前对一些敏感信息进行清理。
我正在使用与 Impala 网络客户端。
我想做的是:
例如,列info '京客隆(三里屯店)' ,然后我需要把它转换成 '京XXX店)' .
我的问题是:

select '京客隆(三里屯店)', concat(substr('京客隆(三里屯店)', 1, 3), 'XXX', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') -6, 6));

但我在输出中得到了胡言乱语:

'京客隆(三里屯店)' | concat(substr('京客隆(三里屯店)', 1, 3), 'xxx', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') - 6, 6))    
京客隆(三里屯店)   |   京XXX�店�

问题是: select '京客隆(三里屯店)', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') -3 , 3); 输出: 京客隆(三里屯店) �� 没有正确的字符。为什么?我将字符串粘贴到pythonshell中,如果只取最后3个字节,就可以得到正确的字符。

xvw2m8pv

xvw2m8pv1#

原来我误解了这个函数 substr . substr(STRING a, INT start [, INT len]) :
它需要从(包括)开始的字符 INT start . 比如我的字符串 '京客隆(三里屯店)'27 字节长,每个utf8字符占用3个字节。我要拿最后一个 3 字节,这是 ,那么我需要写: substr('京客隆(三里屯店), 27 - 2 ,3 ) .
然后它得到 25, 26, 27 3字节并显示字符 正确地。
更新时间:
我被告知要使用: SELECT regexp_replace('京客隆(三里屯店)', '(.)(.*)(.{2})', '\\1***\\3'); 很有魅力:p。

相关问题