详细操作:相关代码
import javafx.scene.control.Tab;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.xml.stream.events.Namespace;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
/**
* @ClassName: HbaseDemo
* @Description:
* @Author: kele
* @Date: 2021/2/22 10:04
**/
public class HbaseDemo {
public Admin admin = null;
public Connection connection;
@Before
//创建连接
public void before() throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","hadoop102:2181,hadoop103:2181,hadoop104:2181");
connection = ConnectionFactory.createConnection(conf);
admin = connection.getAdmin();
}
//关闭连接
@After
public void after(){
try {
if(connection != null)
connection.close();
if(admin != null)
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/******************************************命名空间操作*****************************************************************************/
/**
* namespace操作和ddl操作使用的是admin对象
*/
/**
* 创建namespace对象
*/
@Test
public void createNameSpace() throws IOException {
//创建命名空间描述
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create("bigdata2").build();
admin.createNamespace(namespaceDescriptor);
}
/**
* 查看所有命名空间
*/
@Test
public void listNameSpace() throws IOException {
NamespaceDescriptor[] descriptors = admin.listNamespaceDescriptors();
for(NamespaceDescriptor descriptor : descriptors){
String name = descriptor.getName();
System.out.println(name);
}
}
/**
* 查看某个namespace的描述
*/
@Test
public void describeNamespace() throws IOException {
NamespaceDescriptor bigdata2 = admin.getNamespaceDescriptor("bigdata");
System.out.println(bigdata2.getName());
}
/**
* 查看命名空间下所有的表
*/
@Test
public void NameSpaceTables() throws IOException {
//查看所有在所有命名空间下的所有的表
/* TableName[] tableNames = admin.listTableNames();
for(TableName tablename:tableNames){
System.out.println(tablename.getNameAsString());
}
*/
//获取某个库下所有表的信息
List<TableDescriptor> tableDescriptorList = admin.listTableDescriptorsByNamespace("bigdata2".getBytes());
for(TableDescriptor tableDescriptor : tableDescriptorList){
System.out.println(tableDescriptor.getTableName().getNameAsString());
}
}
/**
* 删除namespace
* 1、先失效namespace下的所有表
* 2、删除namespace下的所有表
* 3、删除namespace
* @throws IOException
*/
@Test
public void dropNamespce() throws IOException {
List<TableDescriptor> tableDescriptors = admin.listTableDescriptorsByNamespace("bigdata2".getBytes());
for (TableDescriptor tableDescriptor : tableDescriptors) {
//失效表
admin.disableTable(tableDescriptor.getTableName());
//删除表
admin.deleteTable(tableDescriptor.getTableName());
}
//删除命名空间
admin.deleteNamespace("bigdata2");
}
/************************************************table操作 DDL*******************************************************************/
/**
* 创建表
* @throws IOException
*/
@Test
public void createtable() throws IOException {
//配置列族描述
ColumnFamilyDescriptor f1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes())
//设置版本个数
.setMaxVersions(2)
.build();
ColumnFamilyDescriptor f2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes())
.build();
List<ColumnFamilyDescriptor> f = new ArrayList<>();
f.add(f1);
f.add(f2);
//2、通过工厂类创建对象
TableDescriptor tdb = TableDescriptorBuilder.newBuilder(TableName.valueOf("bigdata2:student3"))
//设置列族
.setColumnFamilies(f)
.build();
//1、创建表,需要传入TableDescriptor
//admin.createTable(tdb);
//预分区创建表方式一
//admin.createTable(tdb,"10".getBytes(),"30".getBytes(),4);
//预分区创建表方式二
byte[][] b = new byte[][]{"100".getBytes(),"200".getBytes()};
admin.createTable(tdb,b);
}
/**
*修改表
*/
@Test
public void alterTable() throws IOException {
/**
* 声明修改的部分修改,未声明的部分不修改
* modifyColumnFamily
*/
/* TableName name = TableName.valueOf("bigdata2:student");
ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes())
.setMaxVersions(5)
.build();
admin.modifyColumnFamily(name,columnFamilyDescriptor);*/
/**
* 修改格式为定义的修改, //本例中只保留f1的列族,其余的会删除
* modifyTable
*/
ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder
.newBuilder("f1".getBytes())
.setMaxVersions(5).build();
TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf("bigdata2:student"))
.setColumnFamily(columnFamilyDescriptor)
.build();
admin.modifyTable(tableDescriptor);
}
/**
* 删除表
*/
@Test
public void dropTable() throws IOException {
if(admin.tableExists(TableName.valueOf("bigdata:student"))){
//禁用表
admin.disableTable(TableName.valueOf("bigdata:student"));
//删除表
admin.deleteTable(TableName.valueOf("bigdata:student"));
}
}
/************************************************数据操作 DML*******************************************************************/
//DML操作需要使用connection对象
/*************
* 插入数据
* @throws IOException
*/
@Test
public void putdata() throws IOException {
//1、获取表
Table table = connection.getTable(TableName.valueOf("bigdata2:student"));
Put put = new Put("1000".getBytes());
put.addColumn("f1".getBytes(),"name".getBytes(),"zhangsan".getBytes());
put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(20));
put.addColumn("f1".getBytes(),"add".getBytes(),"shenzhen".getBytes());
//2、向表中添加数据
table.put(put);
//3、关闭表
table.close();
}
/**
* 集体添加数据
* @throws IOException
*/
@Test
public void putdatas() throws IOException {
Random random = new Random();
//1、获取连接对象
Table table = connection.getTable(TableName.valueOf("bigdata2:student"));
List<Put> puts = new ArrayList<Put>();
for (int i = 0; i < 8; i++) {
Put put = new Put(("100"+i).getBytes());
put.addColumn("f1".getBytes(),"name".getBytes(),("zhang"+i).getBytes());
put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(random.nextInt(99)+1));
put.addColumn("f1".getBytes(),"address".getBytes(),("shenzhen-"+i).getBytes());
puts.add(put);
}
table.put(puts);
table.close();
}
/**
* 查询数据
* @throws IOException
*/
@Test
public void getdata() throws IOException {
Table table = connection.getTable(TableName.valueOf("bigdata2:student"));
Get get = new Get("1001".getBytes());
//查询某个列族
//get.addFamily("f1".getBytes());
//查询某个列
get.addColumn("f1".getBytes(),"name".getBytes());
get.readVersions(3);
Result result = table.get(get);
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
/**
* 由于数据是一整行返回的,所以在查询时,通过三个参数获取数据
* Array:返回的数据
* length:某段数据的长度
* offset:某段数据的起始位置
*/
//获取cell的列族
String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
//获取cell的列限定符
String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
//获取rowkey的值
String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
//获取cell的值
if("f1".equals(family) && "age".equals(qualify)){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}else{
String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}
}
}
/*********************
* 全局查询
*/
@Test
public void scanData() throws IOException {
//1、获取连接
Table table = connection.getTable(TableName.valueOf("bigdata2:student"));
Scan scan = new Scan();
//查询某个列族
//scan.addFamily("f1".getBytes());
//查询某个列限定符的
scan.addColumn("f1".getBytes(),"name".getBytes());
//查询多个版本
scan.readVersions(2);
//按照范围查询
scan.withStartRow("1005".getBytes(),true);
//2、获取全局查询
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result row = iterator.next();
List<Cell> cells = row.listCells();
for (Cell cell : cells) {
//方式一
/*
//获取cell的列族
String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
//获取cell的列限定符
String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
//获取rowkey的值
String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
//获取cell的值
if("f1".equals(family) && "age".equals(qualify)){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}else{
String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}
*/
/**
* 方式二:使用cellUtil的方式,更加简单
*/
//获取列族
String family = new String(CellUtil.cloneFamily(cell));
//获取列限定符
String qualify = new String(CellUtil.cloneQualifier(cell));
//获取row
String rowkey = new String(CellUtil.cloneRow(cell));
if("f1".equals(family) && "age".equals(qualify)){
int value = Bytes.toInt(CellUtil.cloneValue(cell));
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}else{
String value = new String(CellUtil.cloneValue(cell));
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}
}
}
}
/**
* 过滤查询
* 实现mysql中的where、like、where 条件 and 条件 or 条件
*/
@Test
public void file() throws IOException {
//1、获取连接
Table table = connection.getTable(TableName.valueOf("bigdata2:student"));
Scan scan = new Scan();
/**##########通过setFilter进行过滤,相当于mysql中的where查询
* 判断是否为某一确定值
*/
/*
/*
//如果限定符写未定义的,则查询结果为所有值
SingleColumnValueFilter filter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, "zhang1".getBytes());
scan.setFilter(filter);
*/
/**##############
* 类似于mysql中的like(模糊)查询
*/
/* SubstringComparator lisi = new SubstringComparator("lisi");
SingleColumnValueFilter filter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, lisi);
scan.setFilter(filter);
*/
/**##############
* where 条件 and 条件 or 条件
*
* where(name == ‘lisi1’ and age == 66) or name == 'zhang3'
*/
//条件1:查询名字带有lisi的
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL,"lisi1".getBytes());
//条件2:查询年龄是66的
SingleColumnValueFilter filter2 = new SingleColumnValueFilter("f1".getBytes(), "age".getBytes(), CompareOperator.EQUAL,Bytes.toBytes(66));
//合并条件1、2
FilterList lisiAnd66 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filter1,filter2);
//条件3:查询名字是zhang3
SingleColumnValueFilter filter3 = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL,"zhang3".getBytes());
//合并条件1、2、3
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE,lisiAnd66,filter3);
scan.setFilter(filterList);
//2、获取全局查询
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result row = iterator.next();
List<Cell> cells = row.listCells();
for (Cell cell : cells) {
//方式一
/*
//获取cell的列族
String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
//获取cell的列限定符
String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
//获取rowkey的值
String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
//获取cell的值
if("f1".equals(family) && "age".equals(qualify)){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}else{
String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}
*/
/**
* 方式二:使用cellUtil的方式,更加简单
*/
//获取列族
String family = new String(CellUtil.cloneFamily(cell));
//获取列限定符
String qualify = new String(CellUtil.cloneQualifier(cell));
//获取row
String rowkey = new String(CellUtil.cloneRow(cell));
if("f1".equals(family) && "age".equals(qualify)){
int value = Bytes.toInt(CellUtil.cloneValue(cell));
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}else{
String value = new String(CellUtil.cloneValue(cell));
System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
}
}
}
}
/***********************************************************************************************************/
/**
* 清空表
*
* 清空表之前要先禁用表,处理对数据的操作,其他的都使用admin
*/
@Test
public void truncateData() throws IOException {
admin.disableTable(TableName.valueOf("bigdata2:student"));
admin.truncateTable(TableName.valueOf("bigdata2:student"),true);
}
}