package com.sanlen.hbase.demo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellScanner;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;
public class HbaseClientDemo {
Connection conn=null;
@Before
public void init() throws Exception{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "wmxpc1:2181,wmxpc2:2181,wmxpc3:2181");
conn=ConnectionFactory.createConnection(conf);
}
/**
* 建表
* Admin用于ddl操作
* @throws Exception
*/
@Test
public void testCreateTable() throws Exception{
Admin admin = conn.getAdmin();
//设置表名
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("tb_eclipse"));
//设置列族参数
HColumnDescriptor f1 = new HColumnDescriptor("liezu1");
f1.setMinVersions(1);
f1.setMaxVersions(3);
//在表中添加列族参数
descriptor.addFamily(f1);
//创建表
admin.createTable(descriptor);
//关闭连接
admin.close();
conn.close();
}
/**
* 删除表(删除表之前需要先禁用表)
*/
@Test
public void delTable() throws Exception{
Admin admin = conn.getAdmin();
admin.disableTable(TableName.valueOf("tb_eclipse"));
admin.deleteTable(TableName.valueOf("tb_eclipse"));
admin.close();
conn.close();
}
/**
* 修改表
*/
@Test
public void updateTable() throws Exception{
Admin admin = conn.getAdmin();
//得到表的描述
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("tb_eclipse"));
//创建列族描述
HColumnDescriptor f2 = new HColumnDescriptor("f2");
f2.setBlocksize(131072);
descriptor.addFamily(f2);
//修改表
admin.modifyTable(TableName.valueOf("tb_eclipse"), descriptor);
admin.close();
conn.close();
}
/**
* 插入数据,使用名称空间(不指定则为default),表,行和列定位一个固定的单元,在这个单元里面可以插入任意多个key-value值
* 插入数据的时候最好全部使用字符串类型的,取出来的时候需要什么类型的再转,这样方便取数据
*
*/
@Test
public void testPut() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
//数据存储到wmx-8-20这行
Put put = new Put("wmx-8-23".getBytes());
//数据存储在f1这个列族
put.addColumn("f2".getBytes(), "uid".getBytes(), Bytes.toBytes(1));
put.addColumn("f2".getBytes(), "uname".getBytes(), Bytes.toBytes("wumanxin"));
put.addColumn("f2".getBytes(), "age".getBytes(), Bytes.toBytes(22));
//数据存储到wmx-8-20这行
Put put1 = new Put("wmx-8-24".getBytes());
//数据存储在f1这个列族
put1.addColumn("f2".getBytes(), "weight".getBytes(), Bytes.toBytes(89));
put1.addColumn("f2".getBytes(), "habby".getBytes(), Bytes.toBytes("computer"));
ArrayList<Put> list = new ArrayList<Put>();
list.add(put);
list.add(put1);
table.put(list);
table.close();
conn.close();
}
/**
* 更新数据(更新数据的定位:名称空间(数据库)-->表-->行-->列族(列)-->key)
*/
@Test
public void testUpdate() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Put put = new Put("wmx-8-22".getBytes());
put.addColumn("f2".getBytes(), "uname".getBytes(), Bytes.toBytes("zhangsan"));
table.put(put);
table.close();
conn.close();
}
/**
* 删除数据(删除行wmx-8-20和wmx-8-22,列f2,中的uname)
* 删除数据可以整行的删除和仅仅删除一个键,delete没有使用addColumn()方法,则整个行就会被删除,
* 使用的addColumn()则只会删除其中的一个key,删除不是仅仅删除值,而是整个键值对均会被删除
*/
@Test
public void testDeleteKv() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Delete delete = new Delete("wmx-8-20".getBytes());
delete.addColumn("f2".getBytes(), "uname".getBytes());
Delete delete1 = new Delete("wmx-8-22".getBytes());
delete1.addColumn("f2".getBytes(), "uname".getBytes());
ArrayList<Delete> list = new ArrayList<Delete>();
list.add(delete);
list.add(delete1);
table.delete(list);
table.close();
conn.close();
}
/**
* 删除整行数据
* @throws Exception
*/
@Test
public void testDeleteRow() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Delete delete = new Delete("wmx-8-20".getBytes());
table.delete(delete);
table.close();
conn.close();
}
/**
* 查询key的值
* @throws Exception
*/
@Test
public void testGet() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Get get = new Get("wmx-8-23".getBytes());
Result result = table.get(get);
byte[] value = result.getValue("f2".getBytes(), "habby".getBytes());
System.out.println(new String(value));
//查询单元格的值
printResult(result);
table.close();
conn.close();
}
/**
* 查询行数据(包前不包后)
*/
@Test
public void testScan() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
//带上\000则可以将wmx-8-24这一行给显示出来
Scan scan = new Scan("wmx-8-20".getBytes(), "wmx-8-24+\000".getBytes());
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
printResult(next);
}
}
/**
* 遍历打印一行结果的工具方法
* @param result
* @throws IOException
*/
private void printResult(Result result) throws IOException {
CellScanner cellScanner = result.cellScanner();
while(cellScanner.advance()){
//取到一个单元格,单元格存储的是key-value键值对
Cell current = cellScanner.current();
byte[] rowArray = current.getRowArray();
String rowkey=Bytes.toString(rowArray,current.getRowOffset(),current.getRowLength());
byte[] familyArray = current.getFamilyArray();
String f = Bytes.toString(familyArray,current.getFamilyOffset(),current.getFamilyLength());
byte[] qualifierArray = current.getQualifierArray();
String q = Bytes.toString(qualifierArray,current.getQualifierOffset(),current.getQualifierLength());
byte[] valueArray = current.getValueArray();
String v = Bytes.toString(valueArray,current.getValueOffset(),current.getValueLength());
System.out.println(rowkey+","+f+","+q+","+v);
}
}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellScanner;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;
public class HbaseClientDemo {
Connection conn=null;
@Before
public void init() throws Exception{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "wmxpc1:2181,wmxpc2:2181,wmxpc3:2181");
conn=ConnectionFactory.createConnection(conf);
}
/**
* 建表
* Admin用于ddl操作
* @throws Exception
*/
@Test
public void testCreateTable() throws Exception{
Admin admin = conn.getAdmin();
//设置表名
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("tb_eclipse"));
//设置列族参数
HColumnDescriptor f1 = new HColumnDescriptor("liezu1");
f1.setMinVersions(1);
f1.setMaxVersions(3);
//在表中添加列族参数
descriptor.addFamily(f1);
//创建表
admin.createTable(descriptor);
//关闭连接
admin.close();
conn.close();
}
/**
* 删除表(删除表之前需要先禁用表)
*/
@Test
public void delTable() throws Exception{
Admin admin = conn.getAdmin();
admin.disableTable(TableName.valueOf("tb_eclipse"));
admin.deleteTable(TableName.valueOf("tb_eclipse"));
admin.close();
conn.close();
}
/**
* 修改表
*/
@Test
public void updateTable() throws Exception{
Admin admin = conn.getAdmin();
//得到表的描述
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("tb_eclipse"));
//创建列族描述
HColumnDescriptor f2 = new HColumnDescriptor("f2");
f2.setBlocksize(131072);
descriptor.addFamily(f2);
//修改表
admin.modifyTable(TableName.valueOf("tb_eclipse"), descriptor);
admin.close();
conn.close();
}
/**
* 插入数据,使用名称空间(不指定则为default),表,行和列定位一个固定的单元,在这个单元里面可以插入任意多个key-value值
* 插入数据的时候最好全部使用字符串类型的,取出来的时候需要什么类型的再转,这样方便取数据
*
*/
@Test
public void testPut() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
//数据存储到wmx-8-20这行
Put put = new Put("wmx-8-23".getBytes());
//数据存储在f1这个列族
put.addColumn("f2".getBytes(), "uid".getBytes(), Bytes.toBytes(1));
put.addColumn("f2".getBytes(), "uname".getBytes(), Bytes.toBytes("wumanxin"));
put.addColumn("f2".getBytes(), "age".getBytes(), Bytes.toBytes(22));
//数据存储到wmx-8-20这行
Put put1 = new Put("wmx-8-24".getBytes());
//数据存储在f1这个列族
put1.addColumn("f2".getBytes(), "weight".getBytes(), Bytes.toBytes(89));
put1.addColumn("f2".getBytes(), "habby".getBytes(), Bytes.toBytes("computer"));
ArrayList<Put> list = new ArrayList<Put>();
list.add(put);
list.add(put1);
table.put(list);
table.close();
conn.close();
}
/**
* 更新数据(更新数据的定位:名称空间(数据库)-->表-->行-->列族(列)-->key)
*/
@Test
public void testUpdate() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Put put = new Put("wmx-8-22".getBytes());
put.addColumn("f2".getBytes(), "uname".getBytes(), Bytes.toBytes("zhangsan"));
table.put(put);
table.close();
conn.close();
}
/**
* 删除数据(删除行wmx-8-20和wmx-8-22,列f2,中的uname)
* 删除数据可以整行的删除和仅仅删除一个键,delete没有使用addColumn()方法,则整个行就会被删除,
* 使用的addColumn()则只会删除其中的一个key,删除不是仅仅删除值,而是整个键值对均会被删除
*/
@Test
public void testDeleteKv() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Delete delete = new Delete("wmx-8-20".getBytes());
delete.addColumn("f2".getBytes(), "uname".getBytes());
Delete delete1 = new Delete("wmx-8-22".getBytes());
delete1.addColumn("f2".getBytes(), "uname".getBytes());
ArrayList<Delete> list = new ArrayList<Delete>();
list.add(delete);
list.add(delete1);
table.delete(list);
table.close();
conn.close();
}
/**
* 删除整行数据
* @throws Exception
*/
@Test
public void testDeleteRow() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Delete delete = new Delete("wmx-8-20".getBytes());
table.delete(delete);
table.close();
conn.close();
}
/**
* 查询key的值
* @throws Exception
*/
@Test
public void testGet() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
Get get = new Get("wmx-8-23".getBytes());
Result result = table.get(get);
byte[] value = result.getValue("f2".getBytes(), "habby".getBytes());
System.out.println(new String(value));
//查询单元格的值
printResult(result);
table.close();
conn.close();
}
/**
* 查询行数据(包前不包后)
*/
@Test
public void testScan() throws Exception{
Table table = conn.getTable(TableName.valueOf("tb_eclipse"));
//带上\000则可以将wmx-8-24这一行给显示出来
Scan scan = new Scan("wmx-8-20".getBytes(), "wmx-8-24+\000".getBytes());
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
printResult(next);
}
}
/**
* 遍历打印一行结果的工具方法
* @param result
* @throws IOException
*/
private void printResult(Result result) throws IOException {
CellScanner cellScanner = result.cellScanner();
while(cellScanner.advance()){
//取到一个单元格,单元格存储的是key-value键值对
Cell current = cellScanner.current();
byte[] rowArray = current.getRowArray();
String rowkey=Bytes.toString(rowArray,current.getRowOffset(),current.getRowLength());
byte[] familyArray = current.getFamilyArray();
String f = Bytes.toString(familyArray,current.getFamilyOffset(),current.getFamilyLength());
byte[] qualifierArray = current.getQualifierArray();
String q = Bytes.toString(qualifierArray,current.getQualifierOffset(),current.getQualifierLength());
byte[] valueArray = current.getValueArray();
String v = Bytes.toString(valueArray,current.getValueOffset(),current.getValueLength());
System.out.println(rowkey+","+f+","+q+","+v);
}
}
}