创建HBase全局二级索引
场景介绍
- 在用户的表中预先存在大量数据的情况下,可以在某个列上添加索引。
- 对于未建立索引的用户表,该工具允许用户同时添加和构建索引。
创建HBase全局二级索引
在HBase客户端执行以下命令即可添加或创建索引,执行命令后,指定的索引将被添加到表中:
hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='table' -Dindexspecs.to.add='idx1=>cf1:[c1->string],[c2]#idx2=>cf2:[c1->string],[c2]#idx3=>cf1:[c1];cf2:[c1]' -Dindexspecs.covered.family.to.add='idx2=>cf1' -Dindexspecs.covered.to.add='idx1=>cf1:[c3],[c4]' -Dindexspecs.coveredallcolumn.to.add='idx3=>true' -Dindexspecs.splitkeys.to.set='idx1=>[\x010,\x011,\x012]#idx2=>[\x01a,\x01b,\x01c]#idx3=>[\x01d,\x01e,\x01f]'
相关参数介绍如下:
- tablename.to.index:表示创建索引的数据表的名称。
当使用tablename.to.index创建索引时,如果数据表为空表,创建的索引状态为ACTIVE,否则索引状态为INACTIVE。
- indexspecs.to.addandbuild(可选):表示创建时同时生成索引数据,数据表数据量较大时不建议使用,建议使用索引数据生成工具生成索引数据。
indexspecs.to.addandbuild和tablename.to.index不能同时使用,当使用indexspecs.to.addandbuild时,索引状态为BUILDING,当索引数据完整生成后,索引状态会修改为ACTIVE。
- indexspecs.to.add:表示索引名与对应数据表的列的映射(索引列定义)。
- indexspecs.covered.to.add(可选):表示索引中冗余存储的数据表的列(覆盖列定义)。
- indexspecs.covered.family.to.add(可选):表示索引表冗余存储的数据表的列族(覆盖列族定义)。
- indexspecs.coveredallcolumn.to.add(可选):表示索引表冗余存储数据表中的所有数据(覆盖所有列)。
- indexspecs.splitkeys.to.set(可选):表示索引表预分区切分点,建议指定,避免索引表Region成为热点。预分区指定格式为:
- '#'用于分隔索引。
- splitkey包含在'[]'中。
- ','用于分隔splitkey。
预分区每个splitkey必须由\x01开头。
- idx1、idx2、idx3:表示索引名称。
- cf1、cf2:表示列族名称。
- c1、c2、c3、c4:表示列名称。
- string:表示数据类型。支持STRING、INTEGER、FLOAT、LONG、DOUBLE、SHORT、BYTE和CHAR。
- '#'用于分隔索引,';' 用于分隔列族,','用于分隔列限定符。
- 列名及其数据类型应包含在'[]'中。
- 列名及其数据类型通过'->'分隔。
- 如果未指定具体列的数据类型,则使用默认数据类型(string)。
删除HBase全局二级索引
在HBase客户端执行以下命令可删除某个索引:
hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='table' -Dindexnames.to.drop='idx1#idx2'
相关参数介绍如下:
- tablename.to.index:表示需删除的索引所在的表名称。
- indexnames.to.drop:表示需要删除的索引名称,可以同时指定多个,用#号分隔。