java实现hbase数据库的增删改查操作(新API)
操作环境:
java版本: jdk 1.7以上
hbase 版本:1.2.x
hadoop版本:2.6.0以上
实现功能: 1,创建指定表
2,删除指定表
3,根据表名,行键,列族,列描述符,值插入数据
4,根据指定表获取指定行键rowkey和列族family的数据 并以字符串的形式返回查询到的结果
5,根据table查询表中的所有数据 无返回值,直接在控制台打印结果
7,根据指定表获取指定行键rowKey和列族family的数据 并以Map集合的形式返回查询到的结果
8,根据指定表获取指定行键rowKey的所有数据 并以Map集合的形式返回查询到的结果
9,根据表名获取所有的数据
package com.hbase.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
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.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.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseUtil{
/**
* 连接池对象
*/
protected static Connection connection;
private static final String ZK_QUORUM = "hbase.zookeeper.quorum";
private static final String ZK_CLIENT_PORT = "hbase.zookeeper.property.clientPort";
/**
* HBase位置
*/
private static final String HBASE_POS = "192.168.1.104";
/**
* ZooKeeper位置
*/
private static final String ZK_POS = "localhost";
/**
* zookeeper服务端口
*/
private final static String ZK_PORT_VALUE = "2181";
/**
* 静态构造,在调用静态方法时前进行运行
* 初始化连接对象.
* */
static{
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir", "hdfs://" + HBASE_POS
+ ":9000/hbase");
configuration.set(ZK_QUORUM, ZK_POS);
configuration.set(ZK_CLIENT_PORT, ZK_PORT_VALUE);
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}// 创建连接池
}
/**
* 构造函数,用于初始化内置对象
*/
public HBaseUtil() {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir", "hdfs://" + HBASE_POS
+ ":9000/hbase");
configuration.set(ZK_QUORUM, ZK_POS);
configuration.set(ZK_CLIENT_PORT, ZK_PORT_VALUE);
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}// 创建连接池
}
/**
* @param tableName
* 创建一个表 tableName 指定的表名 seriesStr
* @param seriesStr
* 以字符串的形式指定表的列族,每个列族以逗号的形式隔开,(例如:"f1,f2"两个列族,分别为f1和f2)
**/
public boolean createTable(String tableName, String seriesStr) {
boolean isSuccess = false;// 判断是否创建成功!初始值为false
Admin admin = null;
TableName table = TableName.valueOf(tableName);
try {
admin = connection.getAdmin();
if (!admin.tableExists(table)) {
System.out.println("INFO:Hbase:: " + tableName + "原数据库中表不存在!开始创建...");
HTableDescriptor descriptor = new HTableDescriptor(table);
String[] series = seriesStr.split(",");
for (String s : series) {
descriptor.addFamily(new HColumnDescriptor(s.getBytes()));
}
admin.createTable(descriptor);
System.out.println("INFO:Hbase:: "+tableName + "新的" + tableName + "表创建成功!");
isSuccess = true;
} else {
System.out.println("INFO:Hbase:: 该表已经存在,不需要在创建!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(admin);
}
return isSuccess;
}
/**
* 删除指定表名的表
* @param tableName 表名
* @throws IOException
* */
public boolean dropTable(String tableName) throws IOException {
boolean isSuccess = false;// 判断是否创建成功!初始值为false
Admin admin = null;
TableName table = TableName.valueOf(tableName);
try {
admin = connection.getAdmin();
if (admin.tableExists(table)) {
admin.disableTable(table);
admin.deleteTable(table);
isSuccess = true;
}
} finally {
IOUtils.closeQuietly(admin);
}
return isSuccess;
}
/**
* 向指定表中插入数据
*
* @param tableName
* 要插入数据的表名
* @param rowkey
* 指定要插入数据的表的行键
* @param family
* 指定要插入数据的表的列族family
* @param qualifier
* 要插入数据的qualifier
* @param value
* 要插入数据的值value
* */
protected static void putDataH(String tableName, String rowkey, String family,
String qualifier, Object value) throws IOException {
Admin admin = null;
TableName tN = TableName.valueOf(tableName);
admin = connection.getAdmin();
if (admin.tableExists(tN)) {
try (Table table = connection.getTable(TableName.valueOf(tableName
.getBytes()))) {
Put put = new Put(rowkey.getBytes());
put.addColumn(family.getBytes(), qualifier.getBytes(),
value.toString().getBytes());
table.put(put);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("插入数据的表不存在,请指定正确的tableName ! ");
}
}
/**
* 根据指定表获取指定行键rowkey和列族family的数据 并以字符串的形式返回查询到的结果
*
* @param tableName
* 要获取表 tableName 的表名
* @param rowKey
* 指定要获取数据的行键
* @param family
* 指定要获取数据的列族元素
* @param qualifier
* 指定要获取数据的qualifier
*
* */
protected static String getValueBySeriesH(String tableName, String rowKey,
String family,String qualifier) throws IllegalArgumentException, IOException {
Table table = null;
String resultStr = null;
try {
table = connection
.getTable(TableName.valueOf(tableName.getBytes()));
Get get = new Get(Bytes.toBytes(rowKey));
if( !get.isCheckExistenceOnly()){
get.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));
Result res = table.get(get);
byte[] result = res.getValue(Bytes.toBytes(family),
Bytes.toBytes(qualifier));
resultStr = Bytes.toString(result);
}else{
resultStr = null;
}
} finally {
IOUtils.closeQuietly(table);
}
return resultStr;
}
/**
* 根据table查询表中的所有数据 无返回值,直接在控制台打印结果
* */
@SuppressWarnings("deprecation")
public void getValueByTable(String tableName) throws Exception {
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
ResultScanner rs = table.getScanner(new Scan());
for (Result r : rs) {
System.out.println("获得到rowkey:" + new String(r.getRow()));
for (KeyValue keyValue : r.raw()) {
System.out.println("列:" + new String(keyValue.getFamily())
+ ":" + new String(keyValue.getQualifier())
+ "====值:" + new String(keyValue.getValue()));
}
}
} finally {
IOUtils.closeQuietly(table);
}
}
/**
* 根据指定表获取指定行键rowKey和列族family的数据 并以Map集合的形式返回查询到的结果
*
* @param tableName
* 要获取表 tableName 的表名
* @param rowKey
* 指定的行键rowKey
* @param family
* 指定列族family
* */
protected static Map<String, String> getAllValueH(String tableName,
String rowKey, String family) throws IllegalArgumentException, IOException {
Table table = null;
Map<String, String> resultMap = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowKey));
if(get.isCheckExistenceOnly()){
Result res = table.get(get);
Map<byte[], byte[]> result = res.getFamilyMap(family.getBytes());
Iterator<Entry<byte[], byte[]>> it = result.entrySet().iterator();
resultMap = new HashMap<String, String>();
while (it.hasNext()) {
Entry<byte[], byte[]> entry = it.next();
resultMap.put(Bytes.toString(entry.getKey()),
Bytes.toString(entry.getValue()));
}
}
} finally {
IOUtils.closeQuietly(table);
}
return resultMap;
}
/**
* 根据指定表获取指定行键rowKey的所有数据 并以Map集合的形式返回查询到的结果
* 每条数据之间用&&&将Qualifier和Value进行区分
* @param tableName
* 要获取表 tableName 的表名
* @param rowkey
* 指定的行键rowKey
* */
public ArrayList<String> getFromRowkeyValues(String tableName, String rowkey){
Table table =null;
ArrayList<String> Resultlist = new ArrayList<>();
Get get = new Get(Bytes. toBytes ( rowkey ));
try {
table = connection.getTable(TableName.valueOf(tableName));
Result r = table.get(get);
for (Cell cell : r.rawCells()) {
//每条数据之间用&&&将Qualifier和Value进行区分
String reString = Bytes. toString (CellUtil. cloneQualifier (cell))+"&&&"+Bytes. toString (CellUtil. cloneValue (cell));
Resultlist.add(reString);
}
table.close();
} catch (IOException e1) {
e1.printStackTrace();
}
return Resultlist;
}
/**
* 根据表名获取所有的数据
* */
@SuppressWarnings("unused")
private void getAllValues(String tableName){
try {
Table table= connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
ResultScanner resutScanner = table.getScanner(scan);
for(Result result: resutScanner){
System.out.println("scan: " + result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void getTestDate(String tableName) throws IOException{
Table table = null;
table = connection.getTable(TableName.valueOf(tableName));
int count = 0;
Scan scan = new Scan();
scan.addFamily("f".getBytes());
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,
new RegexStringComparator("112213.*"));
scan.setFilter(filter);
ResultScanner resultScanner = table.getScanner(scan);
for(Result result : resultScanner){
System.out.println(result);
count++;
}
System.out.println("INFO:Hbase:: 测试结束!共有 " + count + "条数据");
}
}
java实现hbase数据库的增删改查操作(新API)的更多相关文章
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...
- PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码
PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...
- python web.py操作mysql数据库,实现对数据库的增删改查操作
使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...
- TP5.1:数据库的增删改查操作(基于面向对象操作)
我们现实中对数据库的增删改查操作,都是使用模型类进行操作的(表名::),也就是面向对象操作,只有底层的代码用的是数据库操作(Db::table('表名')) 下面我将贴出模型类进行的增删改查操作,通过 ...
- TP5.1:数据库的增删改查操作(基于数据库操作)
1.在app/index/controller文件夹下创建一个文件,名为:Operation 注意:起名一定要避开关键字,例如:mysql,curd等等,如果使用关键字起名,会造成报错! 在Opera ...
- greendao对SQLite数据库的增删改查操作
利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- nodejs对mongodb数据库的增删改查操作(转载)
首先要确保mongodb的正确安装,安装参照:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-l ...
- 69.nodejs对mongodb数据库的增删改查操作
转自:https://www.cnblogs.com/sexintercourse/p/6485381.html 首先要确保mongodb的正确安装,安装参照:http://docs.mongodb. ...
随机推荐
- 效率工具 | 快速创建虚拟机,Vagrant真香!
Vagrant 是一个基于Ruby的工具,主要用于创建和部署虚拟化开发环境.它以来于Oracle的开源VirtualBox虚拟化系统,通过使用 Chef创建自动化虚拟环境. Vagrant 主要的功能 ...
- linux seccomp使用和原理
linux seccomp使用和原理 概要 linux的沙箱机制,可以限制进程对系统调用的访问,从系统调用号,到系统调用的参数,都可以检查和限制 有两种模式 SECCOMP_MODE_STRICT, ...
- linux 怎么样复制文件夹内所有文件到另一个文件夹?
cp -Rf /home/user1/* /root/temp/将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user1目录本身.即格式为:cp -Rf 原路径/ 目的 ...
- 「珍贵历史资料鉴赏」CF786B 题解
写在前面 偶然翻到一篇 2019-08-07 18:58 写的未发布的题解. 给大家找点乐子玩. 正文 知识点:线段树优化建图 线段树优化建图 用于解决 类似 从 x 向区间[L,R]的 区间连边问题 ...
- springboot源码解析-管中窥豹系列之Initializer(四)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- docker进入mysql数据库并进行导入 导出
一:导入 1.首先查看docker运行的容器: docker ps 2.将宿主机文件拷贝到docker容器中: docker cp 2020415.sql af491d5466ea:/opt/2020 ...
- LeetCode141-环形链表检测
题目 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置 ...
- GCC 概述:C 语言编译过程详解
Tags: C Description: 关于 GCC 的个人笔记 GCC 概述 对于 GCC 6.1 以及之后的版本,默认使用的 C++ 标准是 C++ 14:使用 -std=c++11 来指定使用 ...
- Docker学习笔记之创建Ubuntu基础镜像
在创建基础镜像之前需要安装Bootstrap工具debootstrap,所以执行命令: sudo apt install debootstrap 软件安装完成后就可以使用debootstrap工具下载 ...
- 【Docker】Docker概述、理解docker的集装箱、标准化、隔离的思想、 docker出现解决了什么问题
整理一下 慕课网 第一个docker化的java应用 Docker环境下的前后端分离项目部署与运维 课程时所做的笔记 Docker概述 docker - https://www.docker.com/ ...