方案:通過kudu的API創(chuàng)建含中文字段的表铐殃,然后在Impala中創(chuàng)建外部表進行關聯(lián)渊迁。下面詳細介紹該方案。
1剃盾、調用Kudu的JavaAPI腺占,創(chuàng)建含有中文字段的表,代碼如下:
public static void createTable(){
? ? ? ? KuduClient client = new KuduClient.KuduClientBuilder("127.0.0.1:7051").build();
? ? ? ? List<ColumnSchema> columns = new LinkedList<ColumnSchema>();
? ? ? ? columns.add(newColumn("id", Type.STRING, true));
? ? ? ? columns.add(newColumn("字段1", Type.STRING, false));
? ? ? ? columns.add(newColumn("字段2", Type.STRING, false));
? ? ? ? Schema schema = new Schema(columns);
? ? ? ? CreateTableOptions options = new CreateTableOptions();
? ? ? ? // 設置表的replica備份和分區(qū)規(guī)則
? ? ? ? List<String> parcols = new LinkedList<String>();
? ? ? ? parcols.add("id");
? ? ? ? // replica數(shù)量
? ? ? ? options.setNumReplicas(3);
? ? ? ? // hash分區(qū)的列
? ? ? ? options.addHashPartitions(parcols, 10);
? ? ? ? try {
? ? ? ? ? ? client.createTable("kudu_test", schema, options);
? ? ? ? } catch (KuduException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? client.close();
? ? ? ? ? ? } catch (KuduException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
2痒谴、在Imapla中創(chuàng)建上述Kudu表的外部表衰伯,腳本如下:
CREATE EXTERNAL TABLE IF NOT EXISTS kudu_test
STORED AS KUDU
TBLPROPERTIES (
? 'kudu.table_name' = 'kudu_test'
);
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表的元數(shù)據(jù)信息時积蔚,原數(shù)據(jù)表的字段編碼不支持中文導致的意鲸。以下是COLUMNS_V2表的相關信息
4、解決Impala元數(shù)據(jù)不支持中文
找到Imapla的元數(shù)據(jù)庫中(我的元數(shù)據(jù)庫名為metastore)尽爆,在該元數(shù)據(jù)庫修改COLUMNS_V2表中字段的編碼格式怎顾,可以執(zhí)行如下SQL:
ALTER TABLE `COLUMNS_V2` CHANGE `COMMENT` `COMMENT` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
ALTER TABLE `COLUMNS_V2` CHANGE `COLUMN_NAME` `COLUMN_NAME` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
ALTER TABLE `COLUMNS_V2` CHANGE `TYPE_NAME` `TYPE_NAME` VARCHAR(4000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
執(zhí)行完上述SQL,刷新下Impala的元數(shù)據(jù)漱贱,就能在Impala中查詢含有中文字段的kudu表了槐雾。