实际工作环境中hive导出数据到Mysql,总是报错
ncorrect string value: ‘\xF0\x9F\x98\x97\xF0\x9F…’这是因为hive表字段中存在特殊字符,但是mysql不支持。
下面写udf函数过滤掉特殊字符:
package com.***;
import org.apache.commons.lang3.CharEncoding;
import org.apache.hadoop.hive.ql.exec.UDF;
public class StringFilterEmoji 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 StringFilterEmoji().evaluate("1、꧁꫞꯭西安分公司负责人,全面主持各项事务;");
System.out.print(evaluate);
}
}
打jar包,上传linux然后再上传到hdfs:
dfs -put /var/lib/hadoop-hdfs/sqoop_b/udf_jar/udf_stringfilter.jar /user/hive/warehouse/ods.db/udf_jar/udf_stringfilter.jar;
hive中添加jar包(包路径指向本地):
add jar /var/lib/hadoop-hdfs/sqoop_b/udf_jar/udf_stringfilter.jar;
创建永久函数:
create function stringfilterEmoji as'com.hy.StringFilterEmoji' using jar 'hdfs:///user/hive/warehouse/ods.db/udf_jar/udf_stringfilter.jar';
或创建临时函数:
create temporary function stringfilterEmoji as 'com.hy.StringFilterEmoji';
参考:
https://blog.csdn.net/weixin_42656794/article/details/90700828
版权声明:本文为weixin_38750084原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。