1. 程式人生 > 實用技巧 >hive 中文欄位解決方法

hive 中文欄位解決方法

使用Impala在kudu中建立含中文欄位名的表

Impala版本: 2.7.0+cdh5.10.2+0

Kudu版本:1.4.0+cdh5.12.0+0

Hue版本:3.9.0+cdh5.10.2+4153

因業務需要,需要在kudu中建立含有中文欄位的表。原來的方案是直接在Hue中Impala查詢介面執行建表指令碼,但是表中含有中文欄位時,就會執行出錯,建表指令碼和出錯資訊如下:

INSERT INTO `COLUMNS_V2` (`CD_ID`,`COMMENT`,`COLUMN_NAME`,`TYPE_NAME`,`INTEGER_IDX`) VALUES (?,?,?,?,?) )

建表指令碼:


  1. create table if not exists kudu_test(

  2. `id` string,

  3. `欄位1` string,

  4. `欄位2` string,

  5. PRIMARY KEY (id)

  6. )

  7. PARTITION BY HASH (id) PARTITIONS 4

  8. stored as kudu;

錯誤資訊:

  • AnalysisException: Invalid column/field name: 欄位1

INSERT INTO `COLUMNS_V2` (`CD_ID`,`COMMENT`,`COLUMN_NAME`,`TYPE_NAME`,`INTEGER_IDX`) VALUES (?,?,?,?,?) )

為了能夠在Kudu中建立含中文欄位的表,並通過Impala查詢該表,可以有以下方案:

方案一:修改Impala原始碼。但是鑑於本人能力有限,擔心原始碼修改後,會產生其他未知異常,因此放棄該方案。

方案二:通過kudu的API建立含中文欄位的表,然後在Impala中建立外部表進行關聯。下面詳細介紹該方案。

1、呼叫Kudu的JavaAPI,建立含有中文欄位的表,程式碼如下:


2、在Imapla中建立上述Kudu表的外部表,指令碼如下:


  1. CREATE EXTERNAL TABLE IF NOT EXISTS kudu_test

  2. STORED AS KUDU

  3. TBLPROPERTIES (

  4. 'kudu.table_name' = 'kudu_test'

  5. );

3、當查詢上述外部表的時候會有如下錯誤資訊:

  • AnalysisException: Failed to load metadata for table: 'kudu_test' CAUSED BY: TableLoadingException: Add request failed : INSERT INTO `COLUMNS_V2` (`CD_ID`,`COMMENT`,`COLUMN_NAME`,`TYPE_NAME`,`INTEGER_IDX`) VALUES (?,?,?,?,?)

這是因為Impala在儲存kudu表的元資料資訊時,原資料表的欄位編碼不支援中文導致的。以下是COLUMNS_V2表的相關資訊

4、解決Impala元資料不支援中文

找到Imapla的元資料庫中(我的元資料庫名為metastore),在該元資料庫修改COLUMNS_V2表中欄位的編碼格式,可以執行如下SQL:


  1. ALTER TABLE `COLUMNS_V2` CHANGE `COMMENT` `COMMENT` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

  2. ALTER TABLE `COLUMNS_V2` CHANGE `COLUMN_NAME` `COLUMN_NAME` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;

  3. ALTER TABLE `COLUMNS_V2` CHANGE `TYPE_NAME` `TYPE_NAME` VARCHAR(4000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

執行完上述SQL,重新整理下Impala的元資料,就能在Impala中查詢含有中文欄位的kudu表了。