更新时间:2022-07-19 GMT+08:00

添加二级索引

功能介绍

您可以使用org.apache.hadoop.hbase.hindex.client.HIndexAdmin中提供的方法来管理HIndexes。 该类提供了将索引添加到现有表的方法:

根据用户是否希望在添加索引操作期间构建索引数据,有两种不同的方法可将索引添加到表中:

  • addIndicesWithData()
  • addIndices()

代码样例

以下代码片段在com.huawei.bigdata.hbase.examples包的“HIndexExample”类的addIndicesExample方法中:

addIndices(): 将索引添加到没有数据的表中

  public void addIndicesExample() {
    LOG.info("Entering Adding a Hindex.");
    // Create index instance
    TableIndices tableIndices = new TableIndices();
    HIndexSpecification spec = new HIndexSpecification(indexNameToAdd);
    spec.addIndexColumn(new HColumnDescriptor("info"), "name", ValueType.STRING);
    tableIndices.addIndex(spec);
    Admin admin = null;
    HIndexAdmin iAdmin = null;
    try {
      admin = conn.getAdmin();
      iAdmin = HIndexClient.newHIndexAdmin(admin);
      // add index to the table
      iAdmin.addIndices(tableName, tableIndices);
      // Alternately, add the specified indices with data
      // iAdmin.addIndicesWithData(tableName, tableIndices);
      LOG.info("Successfully added indices to the table " + tableName);
    } catch (IOException e) {
      LOG.error("Add Indices failed for table " + tableName + "." + e);
    } finally {
      if (iAdmin != null) {
        try {
          // Close the HIndexAdmin object.
          iAdmin.close();
        } catch (IOException e) {
          LOG.error("Failed to close HIndexAdmin ", e);
        }
      }
      if (admin != null) {
        try {
          // Close the Admin object.
          admin.close();
        } catch (IOException e) {
          LOG.error("Failed to close admin ", e);
        }
      }
    }
    LOG.info("Exiting Adding a Hindex.");
  }

以下代码片段在com.huawei.bigdata.hbase.examples包的“HIndexExample”类的addIndicesExampleWithData方法中:

addIndicesWithData():将索引添加到具有大量预先存在数据的表中

  public void addIndicesExampleWithData() {
    LOG.info("Entering Adding a Hindex With Data.");
    // Create index instance
    TableIndices tableIndices = new TableIndices();
    HIndexSpecification spec = new HIndexSpecification(indexNameToAdd);
    spec.addIndexColumn(new HColumnDescriptor("info"), "age", ValueType.STRING);
    tableIndices.addIndex(spec);
    Admin admin = null;
    HIndexAdmin iAdmin = null;
    try {
      admin = conn.getAdmin();
      iAdmin = HIndexClient.newHIndexAdmin(admin);
      // add index to the table
      iAdmin.addIndicesWithData(tableName, tableIndices);
      // Alternately, add the specified indices with data
      // iAdmin.addIndicesWithData(tableName, tableIndices);
      LOG.info("Successfully added indices to the table " + tableName);
    } catch (IOException e) {
      LOG.error("Add Indices failed for table " + tableName + "." + e);
    } finally {
      if (iAdmin != null) {
        try {
          // Close the HIndexAdmin object.
          iAdmin.close();
        } catch (IOException e) {
          LOG.error("Failed to close HIndexAdmin ", e);
        }
      }
      if (admin != null) {
        try {
          // Close the Admin object.
          admin.close();
        } catch (IOException e) {
          LOG.error("Failed to close admin ", e);
        }
      }
    }
    LOG.info("Exiting Adding a Hindex With Data.");
  }