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. ...
随机推荐
- lambda表达式初识
简单来说,一般提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 而匿名函数就是没有名字的函数,有时函数只是临时一用,而且它的业务逻辑也相 ...
- eclipse开启的时候adb.exe会自动开启么 怎么让它跟着eclipse自动开启
会的,Eclipse 参数页中的 General > Startup and Shutdown 中默认 Android Development Tools 是自动激活的,它会启动 adb.exe ...
- Ubuntu20.04编译ffmpeg
1.安装编译所需工具,GCC 2.安装yasm nasm yasm和nasm是两个编译器,编译ffmpeg需要用到 安装命令: sudo aptitude install yasm nasm 3.安装 ...
- mysql5.7.20压缩版安装
1.官网下载.zip格式的MySQL Server的压缩包,选择x86或x64版,并解压. 2. 创建 data文件夹 及 my.ini文件,并编辑 [mysqld] # 设置为自己MYSQL的安装目 ...
- iptables自动屏蔽访问网站最频繁的IP
iptables自动屏蔽访问网站频繁的IP 屏蔽每分钟访问超过200的IP 方法1:根据访问日志(Nginx为例 #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) AB ...
- 记录Js动态加载页面.append、html、appendChild、repend添加元素节点不生效以及解决办法
今天再优化blog页面的时候添加了个关注按钮和图片,但是页面上这个按钮和图片时有时无,本来是搞后端的,被这个前端的小问题搞得抓耳挠腮的! 网上各种查询解决方案,把我解决问题的艰辛历程分享出来,希望大家 ...
- yum配置文件下使用自定义变量
yum的配置文件中,可以使用的变量,简称为yum变量: 默认的yum变量有: $releasever(Release Version),发行版的版本 $arch,CPU体系结构,通过 Python 的 ...
- ALV中的fieldcat详解
字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的字段如下: Row_pos: 默认值为0,可选值为1.2.3,既最大分3级别显示 c ...
- 1.2V转3V芯片,电路图很少就三个元件
1.2V的镍氢电池由于稳定高,应用产品也是很广,但是由于电压低,需要1.2V转3V芯片,来将1.2V的电压升压转3V,稳定输出供电. 一般性的1.2V转3V芯片,都是用PW5100比较多,固定输出电压 ...
- 解决安装mysql动态库libstdc++.so.6、libc.so.6版本过低问题
初始化mysql报错: ./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...