问题重现
1..2
2.CDH6.2.0
3.使用root进行操作
1.在Hive中创建一个表,并导入数据如下
2.对s2字段进行排序
select * from hanzi order by s2;
在Hive中:
在中:
由上面两张图可以看出,在Hive和中排序都失败了经过的拼音,没有按照期望中的中文对应的拼音进行排序。
问题解决
1.想要实现对中文字段的排序,需要将中文字段转换成拼音,然后在Hive、中对拼音进行排序即可。因此可以使用UDF在Java中写一个汉字转拼音的程序,然后在Hive、中使用,代码如下:
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("[u4e00-u9fa5]+")) {// 如果字符是中文,则将中文转为汉语拼音
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包
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>cn.com.gzcb.hive.udf.HanyuPinyinHelper</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.1.1-cdh6.2.0</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
使用mvn :命令打包经过的拼音,打好的包如下,以-jar-with-结尾
上传到服务器
3.将jar包上传到HDFS,创建UDF函数
上传到/user/hive/目录下
进入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';
4.再次对hanzi表进行排序
select s2,parse_chinese(s2) as s3 from hanzi order by s3;
Hive
从Hive和的执行结果可以看出,是按照拼音的升序成功进行了排序。
问题总结
无论是Hive还是都不支持中文按照拼音的排序,因为它们支持的主要是标准的ASCII字符集并不包含中文,如果要对中文按照拼音排序,需要通过UDF将中文转换成拼音后实现,而中文转换成拼音的函数Java中有很多现成的参考比较方便。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。