hive 中文字符过滤_0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序
发布日期:2021-06-24 17:53:55 浏览次数:2 分类:技术文章

本文共 1849 字,大约阅读时间需要 6 分钟。

作者:余枫

1.问题重现

  • 测试环境:

1.RedHat7.2

2.CDH6.2.0

3.使用root进行操作

1.在Hive中创建一个表,并导入数据如下

7b606c699e66f32ae416b3148f245626.png

2.对s2字段进行排序

select * from hanzi order by s2;

在Hive中:

5e83229eff9c530c70d03d228a9cef87.png

在Impala中:

bad88e4036481e45c2c53b33154365bc.png

由上面两张图可以看出,在Hive和Impala中排序都失败了,没有按照期望中的中文对应的拼音进行排序。

2.问题解决

1.想要实现对中文字段的排序,需要将中文字段转换成拼音,然后在Hive、Impala中对拼音进行排序即可。因此可以使用UDF在Java中写一个汉字转拼音的程序,然后在Hive、Impala中使用,代码如下:

public String evaluate(String ChineseLanguage) { char[] cl_chars = ChineseLanguage.trim().toCharArray(); String hanyupinyin = ""; HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调 defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V); try { for (int i = 0; i < cl_chars.length; i++) { if (String.valueOf(cl_chars[i]).matches("[一-龥]+")) {// 如果字符是中文,则将中文转为汉语拼音 hanyupinyin += PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0]; } else {// 如果字符不是中文,则不转换 hanyupinyin += cl_chars[i]; } } } catch (BadHanyuPinyinOutputFormatCombination e) { System.out.println("字符不能转成汉语拼音"); } return hanyupinyin;}

2.将编写好的代码打成jar包并上传到服务器

打包前在POM文件中加入配置,将所有依赖也一起打成一个jar包

maven-assembly-plugin cn.com.gzcb.hive.udf.HanyuPinyinHelperjar-with-dependenciesorg.apache.hive hive-exec 2.1.1-cdh6.2.0com.belerweb pinyin4j 2.5.0
a3d3762e5ca2aea7cbcf44ef58460008.png

使用mvn assembly:assembly命令打包,打好的包如下,以-jar-with-dependencies结尾

3e3fbb38fdbd3481c3375c05d80e8eb8.png

上传到服务器

3fdc51765c2bfdb8763e024bfe55effd.png

3.将jar包上传到HDFS,创建UDF函数

上传到/user/hive/udfjar目录下

8df03392ada7e6dcc7b48f6df2559ec4.png

进入Hive中,创建UDF函数

create function default.parse_chinese as 'cn.com.gzcb.hive.udf.HanyuPinyinHelper' using jar 'hdfs://cdh177.macro.com:8020/user/hive/udfjar/hive-udf-0.0.1-SNAPSHOT-jar-with-dependencies.jar';
e08d6522f65297bddb4e69ee71294588.png

4.再次对hanzi表进行排序

select s2,parse_chinese(s2) as s3 from hanzi order by s3;

Hive

78e5a421fcfc62cdd556712b5b06fc4a.png
f9395c7d1228bbbb15eefb1889551356.png

Impala

7ed714e605d68ea3c5a7e898116619b7.png

从Hive和Impala的执行结果可以看出,是按照拼音的升序成功进行了排序。

3.问题总结

无论是Hive还是Impala都不支持中文按照拼音的排序,因为它们支持的主要是标准的ASCII字符集并不包含中文,如果要对中文按照拼音排序,需要通过UDF将中文转换成拼音后实现,而中文转换成拼音的函数Java中有很多现成的参考比较方便。

转载地址:https://blog.csdn.net/weixin_34237125/article/details/112450317 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:wpsppt流程图联系效果_| JEAM | 文章精选:大城市收取交通拥堵费的影响与效果
下一篇:kodi资源_kodi.tv让你从此看4K节目可以更多选择

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月12日 18时29分29秒