Impala在kudu中创建含中文字段名的表

方案:通过kudu的API创建含中文字段的表,然后在Impala中创建外部表进行关联。下面详细介绍该方案。

1、调用Kudu的JavaAPI,创建含有中文字段的表,代码如下:

public static void createTable(){

        KuduClient client = new KuduClient.KuduClientBuilder("127.0.0.1:7051").build();

        List columns = new LinkedList();

        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 parcols = new LinkedList();

        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表了。

你可能感兴趣的:(Impala在kudu中创建含中文字段名的表)