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.
我是 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.