1.将hbase-site.xml拷贝到资源目录下
2.pom.xml
<!--==========================junit======================-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--==========================hbase======================-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.3</version>
</dependency>
3.代码
package com.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Iterator;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
/**
* @author 邹培贤
* @Title: ${file_name}
* @Package ${package_name}
* @Description: hbase的简单增删改查
* @date 2018/7/1920:29
*/
public class TestCRUD {
@Test
/**
* @Description:新建记录
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:19
*/
public void put() throws Exception {
//创建Configuration对象
Configuration conf= HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询tableName对象
TableName tname = TableName.valueOf("ns1:t1");
//获得table
Table table = conn.getTable(tname);
//通过bytes工具类创建字节数组
byte[] rowid= Bytes.toBytes("row2");
//创建put对象
Put put = new Put(rowid);
//列组
byte[] f1= Bytes.toBytes("f1");
//列组下的列
byte[] id= Bytes.toBytes("id");
//值
byte[] value= Bytes.toBytes(101);
put.addColumn(f1,id,value);
//强行插入
table.put(put);
}
@Test
/**
* @Description: 获得某一行某一列组下的列的值
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:17
*/
public void get() throws Exception {
//创建Configuration对象
Configuration conf = HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询TableName对象
TableName tname = TableName.valueOf("ns1:t1");
//获得table
Table table = conn.getTable(tname);
//通过bytes工具类创建字节数组
Get get=new Get(Bytes.toBytes("row2"));
Result result = table.get(get);
byte[] value = result.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
System.out.println(Bytes.toInt(value));
}
@Test
/**
* @Description:删除表的某一行下的某个列组的字段数据
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:36
*/
public void deleteData() throws Exception {
//创建Configuration对象
Configuration conf=HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询TableName对象
TableName tname = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tname);
Delete del = new Delete(Bytes.toBytes("row2"));
del.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("id"));
del.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"));
table.delete(del);
System.out.println("over");
}
@Test
/**
* @Description: 创建名字空间
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:17
*/
public void createNameSpace() throws Exception {
//创建Configuration对象
Configuration conf=HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin=conn.getAdmin();
//创建名字空间描述
NamespaceDescriptor nsd= NamespaceDescriptor.create("ns2").build();
admin.createNamespace(nsd);
NamespaceDescriptor[] ns = admin.listNamespaceDescriptors();
for(NamespaceDescriptor n:ns){
System.out.println(n.getName());
}
}
@Test
/**
* @Description:列出所有的名字空间
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:20
*/
public void listNameSpaces() throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
NamespaceDescriptor[] ns = admin.listNamespaceDescriptors();
for (NamespaceDescriptor n : ns) {
System.out.println(n.getName());
}
}
@Test
/**
* @Description: 创建表
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/19 23:29
*/
public void createTable() throws Exception {
//创建Configuration对象
Configuration conf = HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
//创建表名对象
TableName tableName = TableName.valueOf("ns2:t2");
//创建表描述对象
HTableDescriptor tb=new HTableDescriptor(tableName);
//创建列族描述符
HColumnDescriptor col = new HColumnDescriptor("f1");
tb.addFamily(col);
admin.createTable(tb);
System.out.println("over");
}
@Test
/**
* @Description: 删除表
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/20 10:59
*/
public void deleteTable() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
//先禁用,后删除
//禁用表
admin.disableTable(TableName.valueOf("ns2:t2"));
//删除表
admin.deleteTable(TableName.valueOf("ns2:t2"));
}
@Test
/**
* @Description: 插入万级记录
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/20 9:23
*/
public void bigInsert() throws Exception {
DecimalFormat format=new DecimalFormat();
format.applyPattern("0000");
long start=System.currentTimeMillis();
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("ns1:t1");
HTable table = (HTable) conn.getTable(tableName);
//禁用自动清理缓冲区,改成手动清理缓存区
table.setAutoFlush(false);
for(int i=1;i<10000;i++){
Put put = new Put(Bytes.toBytes("row" + format.format(i)));
//关闭写前日志
put.setWriteToWAL(false);
put.add(Bytes.toBytes("f1"),Bytes.toBytes("id"),Bytes.toBytes(i));
put.add(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"+i));
put.add(Bytes.toBytes("f1"),Bytes.toBytes("age"),Bytes.toBytes(i % 100));
table.put(put);
if(i % 2000==0){
table.flushCommits();
}
table.flushCommits();
}
System.out.println(System.currentTimeMillis() - start);
}
@Test
/**
* @Description:扫描全表(可以指定开始行和结束行)
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/20 9:39
*/
public void scan() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tableName);
Scan scan = new Scan();
//指定开始扫描的行和结束的行,如果不指定则扫描全表,不推荐使用扫描全表,因为时间消耗太大
scan.setStartRow(Bytes.toBytes("row5000"));
scan.setStopRow(Bytes.toBytes("row8000"));
ResultScanner rs = table.getScanner(scan);
Iterator<Result> iterator = rs.iterator();
while(iterator.hasNext()){
Result r = iterator.next();
byte[] name=r.getValue(Bytes.toBytes("f1"),Bytes.toBytes("name"));
System.out.println(Bytes.toString(name));
}
}
@Test
/**
* @Description:动态遍历,已经知道一个列组的名称,动态遍历该列组下的所有列的数据
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/20 9:49
*/
public void scan2() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tableName);
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row5000"));
scan.setStopRow(Bytes.toBytes("row8000"));
ResultScanner rs = table.getScanner(scan);
Iterator<Result> iterator = rs.iterator();
while(iterator.hasNext()){
Result r = iterator.next();
NavigableMap<byte[], byte[]> map = r.getFamilyMap(Bytes.toBytes("f1"));
for(Map.Entry<byte[], byte[]> entryset:map.entrySet()){
String col=Bytes.toString(entryset.getKey());
String val=Bytes.toString(entryset.getValue());
System.out.print(col+":"+val+",");
}
System.out.println();
}
}
@Test
/**
* @Description:动态扫描,扫描一张表的所有列组下的所有数据
* @param ${tags}
* @return ${return_type}
* @throws
* @author 邹培贤
* @date 2018/7/20 10:25
*/
public void scan3() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tableName);
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row5000"));
scan.setStopRow(Bytes.toBytes("row8000"));
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result r = iterator.next();
//得到一行的所有map:key=f1,value=map<Col,Map<Timestamp,value>>
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = r.getMap();
for(Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry:map.entrySet()){
//得到列组
String f = Bytes.toString(entry.getKey());
//得到当前列组下的所有列,以及列所对应的不同时间戳版本的值
NavigableMap<byte[], NavigableMap<Long, byte[]>> value = entry.getValue();
for(Map.Entry<byte[], NavigableMap<Long, byte[]>> values:value.entrySet()){
String c=Bytes.toString(values.getKey());
//获得当前列多对应的所有时间戳的值
NavigableMap<Long, byte[]> v = values.getValue();
for(Map.Entry<Long, byte[]> e:v.entrySet()){
Long time= e.getKey();
String val=Bytes.toString(e.getValue());
System.out.print(f+":"+c+":"+time+":"+val+",");
}
}
}
System.out.println();
}
}
}