更新时间:2023-11-10 GMT+08:00
分享

创建HBase全局二级索引

功能简介

通过调用“org.apache.hadoop.hbase.hindex.global.GlobalIndexAdmin”中的方法进行HBase全局二级索引的管理,该类中addIndices用于创建全局二级索引。

全局二级索引的创建需要指定索引列、覆盖列(可选)、索引表预分区(可选,建议指定)。

在已有存量数据的表上创建全局二级索引,需要创建索引预分区,防止索引表出现热点,索引表数据的rowkey由索引列构成,并且包含分隔符,格式为:\x01索引值\x00,因此预分区需要指定成对应格式,例如,当使用id列和age列作为索引列时,两个列均为整数,使用id列完成预分区,可以指定索引表预分区点为:

\x010,\x011,\x012....

代码样例

以下代码片段在com.huawei.bigdata.hbase.examples包的“GlobalSecondaryIndexSample”类的addIndices方法中。

本样例为数据表user_table创建一个名为index_id_age的索引,使用数据中的idage两个列作为索引列,同时覆盖name列(查询条件不会用到,但是查询结果需要返回该列)。

/**
    * createIndex
    */
public void testCreateIndex() {
    LOG.info("Entering createIndex.");
    // Create index instance
    TableIndices tableIndices = new TableIndices();
    // Create index spec
    // idx_id_age covered info:name
    HIndexSpecification indexSpec = new HIndexSpecification("idx_id_age");

    // Set index column
    indexSpec.addIndexColumn(Bytes.toBytes("info"), Bytes.toBytes("id"), ValueType.STRING);
    indexSpec.addIndexColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), ValueType.STRING);

    // Set covered column
    // If you want cover one column, use addCoveredColumn
    // If you want cover all column in one column family, use addCoveredFamilies
    // If you want cover all column of all column family, use setCoveredAllColumns
    indexSpec.addCoveredColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));

    // Need specify index table split keys, it should specify by index column.
    // Note: index data's row key has a same prefix "\x01"
    // For example:
    // Our index column include "id" and "age", "id" is a number, we
    // could specify split key like \x010 \x011 \x012...
    byte[][] splitKeys = new byte[10][];
    for (int i = 0; i < 10; i++) {
        splitKeys[i] = Bytes.toBytesBinary("\\x01" + i);
    }
    indexSpec.setSplitKeys(splitKeys);
    tableIndices.addIndex(indexSpec);

    // iAdmin will close the inner admin instance
    try (GlobalIndexAdmin iAdmin = GlobalIndexClient.newIndexAdmin(conn.getAdmin())) {
        // add index to the table
        iAdmin.addIndices(tableName, tableIndices);
        LOG.info("Create index successfully.");
    } catch (IOException e) {
        LOG.error("Create index failed.", e);
    }
    LOG.info("Exiting createIndex.");
}
分享:

    相关文档

    相关产品