实际工作环境中hive导出数据到Mysql,总是报错
ncorrect string value: ‘\xF0\x9F\x98\x97\xF0\x9F…’
这是由于手机表情不支持UTF-8的
运营那边需要nickname,所以就将昵称中的表情过滤掉
1.写过滤表情逻辑
/**
* Created by Liutao on 2019/5/22 16:31
*/
public class FilterEmo extends UDF {
public String evaluate(String str) {
StringBuffer out = new StringBuffer();
if (str == null || ("".equals(str)))
return "";
char[] chars = str.toCharArray();
for(int i = 0; i < chars.length; i ++) {
if((chars[i] >= 19968 && chars[i] <= 40869) //中日朝兼容形式的unicode编码范围: U+4E00——U+9FA5
|| (chars[i] >= 11904 && chars[i] <= 42191)//中日朝兼容形式扩展
|| (chars[i] >= 63744 && chars[i] <= 64255)//中日朝兼容形式扩展
|| (chars[i] >= 65072 && chars[i] <= 65103)//中日朝兼容形式扩展
|| (chars[i] >= 65280 && chars[i] <= 65519)//全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母的unicode编码范围:U+FF00——U+FFEF
|| (chars[i] >= 32 && chars[i] <= 126)//半角字符的unicode编码范围:U+0020-U+007e
|| (chars[i] >= 12289 && chars[i] <= 12319)//全角字符的unicode编码范围:U+3000——U+301F
) {
out.append(chars[i]);
}
}
String result=out.toString().trim();
result=result.replaceAll("\\?", "").replaceAll("\\*", "").replaceAll("<|>", "").replaceAll("\\|", "").replaceAll("/", "");
return result;
}
public static void main(String[] args) {
String evaluate = new FilterEmo().evaluate(args[0]);
}
}
2打包到linux环境上
3在hive命令中,输入
add jar /root/Filter1.jar;
create temporary function remo as 'UDF.FilterEmo';
查询
select id,remo(nickname) name from ods_userinfo where dt='';
但是注意一点,这个注册的函数并不是一直都存在的,每次hive关闭再启动就消失了,所以最好是通过shell脚本或者hive -e ,hive -f在里面每次需要调用的时候再操作一边
hive -e "
add jar /root/Filter1.jar;
create temporary function remo as 'UDF.FilterEmo';
select id,remo(nickname) name from ods_userinfo where dt='';
"
版权声明:本文为weixin_42656794原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。