我是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个字节,就可以得到正确的字符。
1条答案
按热度按时间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。