方案:通过kudu的API创建含中文字段的表,然后在Impala中创建外部表进行关联。下面详细介绍该方案。
1、调用Kudu的JavaAPI,创建含有中文字段的表,代码如下:
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备份和分区规则
List<String> parcols = new LinkedList<String>();
parcols.add("id");
// replica数量
options.setNumReplicas(3);
// hash分区的列
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中创建上述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表的元数据信息时,原数据表的字段编码不支持中文导致的。以下是COLUMNS_V2表的相关信息
4、解决Impala元数据不支持中文
找到Imapla的元数据库中(我的元数据库名为metastore),在该元数据库修改COLUMNS_V2表中字段的编码格式,可以执行如下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;
执行完上述SQL,刷新下Impala的元数据,就能在Impala中查询含有中文字段的kudu表了。
网友评论