Impala substr 无法正确获取utf8字符

Impala substr can't get utf8 character correctly

我是 ETL 新手,分配给我的任务是在将数据提供给客户之前清理一些敏感信息。

我正在使用 Impala 的 HUE 网络客户端。

我想做的是:

例如,像'京客隆(三里屯店)'这样的列信息,那么我需要将它转换成像'京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);

输出:京客隆(三里屯店) ��

没有得到正确的字符。 这是为什么? 我把字符串粘贴到 python shell 中,如果我只取最后 3 个字节,我就能得到正确的字符。

原来是我理解错了函数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.