设为首页 加入收藏

TOP

Hive中文注释问题
2018-12-30 13:04:53 】 浏览:50
Tags:Hive 中文 注释 问题

转载:http://blog.csdn.net/namo_amitabha/article/details/9762959

hive元数据建表之后需要修改一些字符集


为了解决hive的specified key was too long; max key length is 767 问题(MySQL的varchar主键只支持不超过768个字节 或者 768/2=384个双字节 或者 768/3=256个三字节的字段,UTF-8是三字节的。),需要将数据库默认字符集改为latin1;

alter database hive character set latin1;


以下是为了支持hive建表时插入中文注释:
//修改字段注释字符集
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
//修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
//修改分区注释字符集
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;


但是建好表之后去describe table得到的中文注释还是乱码,这个需要去修改Hive的源码重新编译:

src/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java 的 describeTable方法,在hive-0.10里这个方法调用了src/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java,

  1. formatter.describeTable(outStream,colPath,tableName,tbl,part,cols,descTbl.isFormatted(),descTbl.isExt());
因此需要修改后一个类的describeTable方法

  1. publicvoiddescribeTable(DataOutputStreamoutStream,
  2. StringcolPath,StringtableName,
  3. Tabletbl,Partitionpart,List<FieldSchema>cols,
  4. booleanisFormatted,booleanisExt)
  5. throwsHiveException
  6. try{
  7. if(colPath.equals(tableName)){
  8. if(!isFormatted){
  9. //outStream.writeBytes(MetaDataFormatUtils.displayColsUnformatted(cols));
  10. outStream.write(MetaDataFormatUtils.displayColsUnformatted(cols).getBytes("UTF-8"));
  11. }else{
  12. outStream.writeBytes(
  13. MetaDataFormatUtils.getAllColumnsInformation(cols,
  14. tbl.isPartitioned()tbl.getPartCols():null));
  15. }
  16. }else{
  17. if(isFormatted){
  18. outStream.writeBytes(MetaDataFormatUtils.getAllColumnsInformation(cols));
  19. }else{
  20. //outStream.writeBytes(MetaDataFormatUtils.displayColsUnformatted(cols));
  21. outStream.write(MetaDataFormatUtils.displayColsUnformatted(cols).getBytes("UTF-8"));
  22. }
  23. }

把outStream.writeBytes方法改成outStream.write方法


重新编译打包之后把src/build/dist/lib/目录下的hive-exec-xxx.jar和hive-builtins-xxxx.jar拷到$HIVE_HOME/lib目录下覆盖原文件即可
            
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hive开窗函数over(partition by ... 下一篇hive 中时间戳与时间字符串的相互..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目