有关HBase的安装能够参考hbase安装java
咱们能够经过hbase shell和hbase数据库进行交互,也能够经过Java-api和hbase数据库交互,这里咱们使用的是hbase-client。shell
主要是介绍2.0重大重构以后的api的基本使用。数据库
#列出全部命名空间 list_namespace #新建命名空间 create_namespace 'namespaceName' #删除命名空间 drop_namespace 'namespaceName' #修改命名空间
create:建立表apache
exists:检查表是否存在api
list:查看全部表dom
alter:修改表oop
delete:删除列ui
disable:禁用表spa
is_enabled:查看表是否禁用.net
desc\describe:查看表结构
drop:删除表
put:插入数据
count:统计表有多少行
get:获取数据
scan:扫描表或者列
#列出全部表 list #列出指定命名空间下的全部表 list_namespace_tables 'namespaceName' #新建一个以命名空间namespaceName的表tableName,列族为cf1。 create 'namespaceName:tableName', 'cf1' create 'tablename','columnFamily1','columnFamily2' create 'tablename',{NAME => 'columnFamily1',VERSIONS => 1, TTL => 214783647, BLOCKCACHE => false,IN_MEMORY=>false},{NAME=>'columnFamily2',VERSIONS=>1,TTL=>259200,BLOCKCACHE=>false,IN_MEMORY=>false} disable 'tableName' #删除表 drop 'tableName' #查看表内容,查看前5行数据 scan 'namespaceName:tableName', {LIMIT=>5} #插入 put tableName rowkey,"columnFamily:column","value" put 'tableName', 'rowkey', 'columnFamilyName:columnName', 'value' #查看 get rowKey get 'tableName', 'rowkey'
删除表中的列簇,先disable表,修改后enable表,严格区分大小写
查询user表中的全部信息 scan 'user' 查询user表中列族为info的信息 scan 'user', {COLUMNS => 'info'} scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5} 查询user表中列族为info和data的信息 scan 'user', {COLUMNS => ['info', 'data']} scan 'user', {COLUMNS => ['info:name', 'data:pic']} 查询user表中列族为info、列标示符为name的信息 scan 'user', {COLUMNS => 'info:name'} 查询user表中列族为info、列标示符为name的信息,而且版本最新的5个 scan 'user', {COLUMNS => 'info:name', VERSIONS => 5} 查询user表中列族为info和data且列标示符中含有a字符的信息 scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"} 查询user表中row key为rk0001,cell的值为中国 scan 'user', 'rk0001', {FILTER => "ValueFilter(=,'binary:中国')"} 查询user表中row key为rk0001,列标示符中含有a的信息 scan 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} 查询user表中row key以rk字符开头的 scan 'user',{FILTER=>"PrefixFilter('rk')"} 查询user表中列族为info,rk范围是[rk0001, rk0003)的数据 scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'} 查询user表中指定范围的数据 scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
get命令也能够使用如上所示的scan命令方式
help:查看命令帮助
status:查看hbase状态
version:查看hbase版本
修改表名HBase没有rename命令,能够经过快照功能修改表名
//为表建立快照,这时尚未复制数据 clone_snapshot 'tableSnapshot', 'newTableName' //根据某个快照而建立新表,此时复制数据 snapshot 'tableName', 'tableSnapshot' //删除快照 delete_snapshot 'tableSnapshot'
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.2.0</version> </dependency>
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.Random; public class HBaseTest { private static final String ZOOKEEPER_QUORUM = "127.0.0.1:2181"; public static final String TABLE_NAME = "test_tb"; private Connection connection; private Configuration configuration; @Before public void setUp() throws IOException { configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", ZOOKEEPER_QUORUM); connection = ConnectionFactory.createConnection(configuration); } @Test public void createTable() throws Exception { Admin admin = connection.getAdmin(); TableName tableName = TableName.valueOf(TABLE_NAME); TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName); ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info"); ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info"); tableDescriptorBuilder.setColumnFamily(baseInfo); tableDescriptorBuilder.setColumnFamily(extInfo); TableDescriptor tableDescriptor = tableDescriptorBuilder.build(); admin.createTable(tableDescriptor); } @Test public void dealTable() throws IOException { Admin admin = connection.getAdmin(); String tableNameString = "test_user"; TableName tableName = TableName.valueOf(tableNameString); if(admin.tableExists(tableName)){ admin.disableTable(tableName); admin.deleteTable(tableName); } } @Test public void descTable() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); TableDescriptor tableDescriptor = table.getDescriptor(); ColumnFamilyDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies(); for(ColumnFamilyDescriptor cfd : columnFamilies){ System.out.println(Bytes.toString(cfd.getName())); } } @Test public void put() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Put put=new Put(Bytes.toBytes("user_info_1")); // put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes("tim")); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes("123")); table.put(put); } @Test public void puts() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); LinkedList<Put> puts = new LinkedList<>(); puts.add(getPut("user_info_2")); puts.add(getPut("user_info_3")); puts.add(getPut("user_info_4")); table.put(puts); } private static Put getPut(String rowKey){ Put put=new Put(Bytes.toBytes(rowKey)); Random random = new Random(); String name = String.valueOf(random.nextInt(1000000)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes(name)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes(name)); return put; } @Test public void get() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Get get =new Get(Bytes.toBytes("user_info_1")); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name")); Result result=table.get(get); List<Cell> cells = result.listCells(); for(Cell cell: cells){ System.out.println(Bytes.toString(cell.getFamilyArray())); System.out.println(Bytes.toString(cell.getQualifierArray())); System.out.println(Bytes.toString(cell.getValueArray())); System.out.println(cell.getTimestamp()); } } @Test public void gets() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); LinkedList<Get> gets = new LinkedList<>(); gets.add(getGet("user_info_1")); gets.add(getGet("user_info_2")); gets.add(getGet("user_info_3")); gets.add(getGet("user_info_4")); Result[] results = table.get(gets); for(Result result : results){ System.out.println(new String(result.getRow())); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name")))); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("tel")))); } } private static Get getGet(String rowKey){ Get get =new Get(Bytes.toBytes(rowKey)); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name")); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel")); return get; } @Test public void scan() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Scan s = new Scan(); ResultScanner resultScanner = table.getScanner(s); for(Result result : resultScanner){ byte[] row = result.getRow(); System.out.println(new String(row)); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name")))); } } @Test public void deleteRowKey() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Delete de =new Delete(Bytes.toBytes("rowKey")); table.delete(de); } @Test public void deleteColumn() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Delete de =new Delete(Bytes.toBytes("rowKey")); de.addColumn(Bytes.toBytes(""), Bytes.toBytes("")); table.delete(de); } @Test public void disableTable() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Admin admin = connection.getAdmin(); admin.disableTable(tableName); } @Test public void listNamespace() throws Exception { Admin admin = connection.getAdmin(); NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors(); for(NamespaceDescriptor namespaceDescriptor : namespaceDescriptors){ System.out.println(namespaceDescriptor.getName()); } } @Test public void listTables() throws IOException { Admin admin = connection.getAdmin(); List<TableDescriptor> tableDescriptors = admin.listTableDescriptors(); for(TableDescriptor tableDescriptor : tableDescriptors){ System.out.println(tableDescriptor.getTableName().getNameAsString()); } } }
重点就是构建链接:
Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", "127.0.0.1:2181"); Connection connection = ConnectionFactory.createConnection(configuration);
相关的操做基本和Admin有关,经过Connection获取Admin:
Admin admin = connection.getAdmin();
再也不使用字符串代表,而是使用TableName抽象:
TableName tableName = TableName.valueOf("tableName");
表描述构建:
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
列簇构建:
ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
下面的createTable基本把表相关的抽象都使用到了:
@Test public void createTable() throws Exception { Admin admin = connection.getAdmin(); TableName tableName = TableName.valueOf(TABLE_NAME); TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName); ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info"); ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info"); tableDescriptorBuilder.setColumnFamily(baseInfo); tableDescriptorBuilder.setColumnFamily(extInfo); TableDescriptor tableDescriptor = tableDescriptorBuilder.build(); admin.createTable(tableDescriptor); }