相关接口文档:
https://hbase.apache.org/book.html#arch.overview
https://hbase.apache.org/apidocs/index.html
http://hbase.apache.org/2.1/apidocs/index.html //我的2.1.8 ,重点参考这个
https://www.docs4dev.com/docs/zh/apache-hbase/2.1/reference 中文文档-用户手册
第1步:创建maven项目
创建项目hbase
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.scitc</groupId>
<artifactId>hbase</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hbase</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hbase.version>2.1.8</hbase.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<!-- 这个依赖没用上
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>${hbase.version}</version>
</dependency> -->
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
第2步:HbaseOperation
HbaseOperation.java代码如下:
package com.scitc.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 java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author geiliHe
* @date 2020-06-09
*/
public class HbaseOperation {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static TableDescriptor tableDescriptor;
//建立连接
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://192.168.56.110:9000/hbase");
configuration.set("hbase.zookeeper.quorum", "master,slave1,slave2");
configuration.set("hbase.zookeeper.property.client", "2181");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
//关闭连接
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
/**1:创建表-pass
* @param tableName 表名
* @param colFamily 列族
* @throws IOException
*/
public static void createTable(String tableName,String[] colFamily) throws IOException {
init();
TableName mytable = TableName.valueOf(tableName);
if(admin.tableExists(mytable)){
System.out.println("talbe is exists!");
}else {
//表描述器构造器
TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(mytable);
//创建集合用于存放列描述对象
List<ColumnFamilyDescriptor> families = new ArrayList<>();
//将每个列族对应的ColumnFamilyDescriptor对象添加到集合中
for(String cols:colFamily) {
families.add(ColumnFamilyDescriptorBuilder.newBuilder(cols.getBytes()).build());
}
tableDescriptor = tdb.setColumnFamilies(families).build();
//创建表
admin.createTable(tableDescriptor);;
}
close();
}
/**
* 2:实现单个数据插入-pass
* 修改数和插入数据一样,不会覆盖原来版本,通过时间戳区别
* @param tableName
* @param rowKey
* @param colFamily
* @param col
* @param val
* @throws IOException
*/
public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
table.put(put);
table.close();
close();
}
/**
* 3-1:通过行键-列族-列:获取单个数据-pass
* @param tableName
* @param rowKey
* @param colFamily
* @param col
* @throws IOException
*/
public static void getData(String tableName,String rowKey,String colFamily,String col)throws IOException{
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
showCell(result);
table.close();
close();
}
/**
* 3-2:通过行键获取值-pass
* @param tableName
* @param rowKey
* @throws IOException
*/
public static void getDataByRowkey(String tableName,String rowKey)throws IOException{
init();
Table table = connection.getTable(TableName.valueOf(tableName));
//获得一行
Get get = new Get(Bytes.toBytes(rowKey));
Result set = table.get(get);
Cell[] cells = set.rawCells();
System.out.print("查询结果");
for (Cell cell: cells){
System.out.println(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + "::" +
Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
table.close();
close();
}
/**
* 4:给制定表添加列族
* @param tableName
* @param familyName
* @throws IOException
*/
public static void addColumnFamily(String tableName, String familyName) throws IOException {
init();
TableName tn = TableName.valueOf(tableName);
// 通过新增的familyName来构建ColumnFamilyDescriptor对象
ColumnFamilyDescriptor columnFamily = ColumnFamilyDescriptorBuilder.newBuilder(familyName.getBytes()).build();
admin.addColumnFamily(tn, columnFamily);
close();
}
/**
* 5:删除单个数据-pass
* @param tableName
* @param rowKey
* @param colFamily
* @param col
* @throws IOException
*/
public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(rowKey.getBytes());
//删除指定列族
//delete.addFamily(Bytes.toBytes(colFamily));
//删除指定列
//delete.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col));
table.delete(delete);
table.close();
close();
}
/**
* 格式化输出获取的数据
* @param result
*/
public static void showCell(Result result){
Cell[] cells = result.rawCells();
for(Cell cell:cells){
System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
System.out.println("Timetamp:"+cell.getTimestamp()+" ");
System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
}
}
/**
* 6:查看已有的表-pass
* @throws IOException
*/
public static void listTables() throws IOException {
init();
TableName[] tables = admin.listTableNames();
for(TableName table:tables) {
System.out.println("hbase数据库的表:"+table.toString());
}
close();
}
/**
* 7:删除一张表
* @param tableName
* @throws IOException
*/
public static void deleteTable(String tableName) throws IOException {
init();
TableName tn = TableName.valueOf(tableName);
if (!admin.tableExists(tn)) {
System.out.print("要删除的表不存在");
}else {
admin.disableTable(tn);
admin.deleteTable(tn);
}
close();
}
public static void main(String[] args) throws IOException {
//createTable("user",new String[]{"address","info"});
//insertRow("user", "tom", "info", "age", "26");
//insertRow("user", "tom", "info", "birthday", "1998-04-05");
//getData("user", "tom", "info", "age");
//deleteRow("user","tom","info","birthday");
//listTables();
getDataByRowkey("user","tom");
}
}
参考文献:
1:https://www.cnblogs.com/swordfall/p/10301707.html