hive 表注釋亂碼以及show create table語句描述亂碼解決



hive 表注釋亂碼以及show create table語句描述亂碼解決


#執行
desc table1
#字段注釋是中文,沒亂碼
desc formatted table1;
字段注釋是中文,沒亂碼
但表注釋是中文 ,顯示是另一種編碼,有問題,解決這塊


元數據庫編碼情況如下:



由於元數據庫使用的是postgresql, 修改數據庫編碼並不能像mysql那樣方便,(暫時沒找到方便的方式處理)
所以直接用修改源代碼的方式 處理

官網上找到相關修改的bug

修改類
ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatUtils.java

下面這個方法替換為

private static void displayAllParameters(Map<String, String> params, StringBuilder tableInfo) {
     List<String> keys = new ArrayList<String>(params.keySet());
     String value = null;
     Collections.sort(keys);
     for (String key : keys) {
       tableInfo.append(FIELD_DELIM); // Ensures all params are indented.
       value = params.get(key);
      if("comment".equals(key)&& null!=value && value.getBytes().length!=key.length())
      {
          formatOutput(key, value, tableInfo);
      }
      else
      {
          formatOutput(key, StringEscapeUtils.escapeJava(value), tableInfo);
      }
     }
   }


####重新編譯hive-exec-0.13.1-cdh5.3.1.jar,再放到    /opt/cloudera/parcels/CDH/jars  目錄下 替換

 



####show create table   有中文亂碼問題, 解決

可參考


修改源代碼
ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java

@@ -2048,7 +2048,7 @@ private int showCreateTable(Hive db, DataOutputStream outStream, String tableNam
       if (tbl.isView()) {
         String createTab_stmt = "CREATE VIEW `" + tableName + "` AS " + tbl.getViewExpandedText();
-        outStream.writeBytes(createTab_stmt.toString());
+        outStream.write(createTab_stmt.toString().getBytes("UTF-8"));
         return 0;
       }

@@ -2196,7 +2196,7 @@ else if (sortCol.getOrder() == BaseSemanticAnalyzer.HIVE_COLUMN_ORDER_DESC) {
       }
       createTab_stmt.add(TBL_PROPERTIES, tbl_properties);
-      outStream.writeBytes(createTab_stmt.render());
+      outStream.write(createTab_stmt.render().getBytes("UTF-8"));
     } catch (IOException e) {
       LOG.info("show create table: " + stringifyException(e));
       return 1;


 
#####重新編譯hive-exec-0.13.1-cdh5.3.1.jar,再放到    /opt/cloudera/parcels/CDH/jars  目錄下 替換



下載hive源代碼可以到這里找到對應版本 http://archive.cloudera.com/cdh5/cdh/5/

cd  /Users/yzygenuine/Downloads/ hive-0.13.1-cdh5.3.1 

##執行如下編譯打包項目

mvn clean package -Phadoop-2 -Pdist -DskipTests -Dtar

同樣了,修改好代碼再編譯打包出新了jar包,去替換線上的





#####替換后效果如下:


hive> show create table dwd_audio_download_redis;
OK
CREATE  TABLE `dwd_audio_download_redis`(
  `audio_id` bigint COMMENT '節目ID', 
  `download_cnt` bigint COMMENT '下載量')
COMMENT '節目從上傳到分區時間的下載量'
PARTITIONED BY ( 
  `day` bigint COMMENT '節目某天統計數據', 
  `hour` bigint COMMENT '節目某時統計數據')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://master:8020/user/hive/warehouse/hive_db.db/dwd_audio_download_redis'
TBLPROPERTIES (
  'transient_lastDdlTime'='1457938879')
Time taken: 0.55 seconds, Fetched: 17 row(s)


######### desc formatted 語句,取出表注釋有中文亂碼總理 ,解決

hive> desc formatted dwd_audio_download_redis;
OK
# col_name              data_type               comment             
audio_id                bigint                  節目ID                
download_cnt            bigint                  下載量                 
# Partition Information          
# col_name              data_type               comment             
day                     bigint                  節目某天統計數據            
hour                    bigint                  節目某時統計數據            
# Detailed Table Information             
Database:               hive_db                  
Owner:                  datamining               
CreateTime:             Mon Mar 14 15:01:19 CST 2016     
LastAccessTime:         UNKNOWN                  
Protect Mode:           None                     
Retention:              0                        
Location:               hdfs://master:8020/user/hive/warehouse/hive_db.db/dwd_audio_download_redis       
Table Type:             MANAGED_TABLE            
Table Parameters:                
        comment                 節目從上傳到分區時間的下載量      
        transient_lastDdlTime   1457938879          
# Storage Information            
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe       
InputFormat:            org.apache.hadoop.mapred.TextInputFormat         
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
Compressed:             No                       
Num Buckets:            -1                       
Bucket Columns:         []                       
Sort Columns:           []                       
Storage Desc Params:             
        serialization.format    1                   
Time taken: 0.514 seconds, Fetched: 34 row(s)


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com