1.HBase读写的方式概况

主要分为:

  1. 纯Java API读写HBase的方式;
  2. Spark读写HBase的方式;
  3. Flink读写HBase的方式;
  4. HBase通过Phoenix读写的方式;

第一种方式是HBase自身提供的比较原始的高效操作方式,而第二、第三则分别是Spark、Flink集成HBase的方式,最后一种是第三方插件Phoenix集成的JDBC方式,Phoenix集成的JDBC操作方式也能在Spark、Flink中调用。

注意:

这里我们使用HBase2.1.2版本,以下代码都是基于该版本开发的。

2. 纯Java API读写HBase

2.1 连接HBase

这里我们采用静态方式连接HBase,不同于2.1.2之前的版本,无需创建HBase线程池,HBase2.1.2提供的代码已经封装好,只需创建调用即可:

/*** 声明静态配置*/
static Configuration conf = null;
static Connection conn = null;
static {conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum", "hadoop01,hadoop02,hadoop03");conf.set("hbase.zookeeper.property.client", "2181");try{conn = ConnectionFactory.createConnection(conf);}catch (Exception e){e.printStackTrace();}
}

2.2 创建HBase的表

创建HBase表,是通过Admin来执行的,表和列簇则是分别通过TableDescriptorBuilder和ColumnFamilyDescriptorBuilder来构建。

/*** 创建只有一个列簇的表* @throws Exception*/
public static void createTable() throws Exception{Admin admin = conn.getAdmin();if (!admin.tableExists(TableName.valueOf("test"))){TableName tableName = TableName.valueOf("test");//表描述器构造器TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(tableName);//列族描述器构造器ColumnFamilyDescriptorBuilder cdb = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("user"));//获得列描述器ColumnFamilyDescriptor cfd = cdb.build();//添加列族
        tdb.setColumnFamily(cfd);//获得表描述器TableDescriptor td = tdb.build();//创建表
        admin.createTable(td);}else {System.out.println("表已存在");}//关闭连接
}

2.3 HBase表添加数据

通过put api来添加数据

/*** 添加数据(多个rowKey,多个列族)* @throws Exception*/
public static void insertMany() throws Exception{Table table = conn.getTable(TableName.valueOf("test"));List<Put> puts = new ArrayList<Put>();Put put1 = new Put(Bytes.toBytes("rowKey1"));put1.addColumn(Bytes.toBytes("user"), Bytes.toBytes("name"), Bytes.toBytes("wd"));Put put2 = new Put(Bytes.toBytes("rowKey2"));put2.addColumn(Bytes.toBytes("user"), Bytes.toBytes("age"), Bytes.toBytes("25"));Put put3 = new Put(Bytes.toBytes("rowKey3"));put3.addColumn(Bytes.toBytes("user"), Bytes.toBytes("weight"), Bytes.toBytes("60kg"));Put put4 = new Put(Bytes.toBytes("rowKey4"));put4.addColumn(Bytes.toBytes("user"), Bytes.toBytes("sex"), Bytes.toBytes("男"));puts.add(put1);puts.add(put2);puts.add(put3);puts.add(put4);table.put(puts);table.close();
}

2.4 删除HBase的列簇或列

/*** 根据rowKey删除一行数据、或者删除某一行的某个列簇,或者某一行某个列簇某列* @param tableName* @param rowKey* @throws Exception*/
public static void deleteData(TableName tableName, String rowKey, String rowKey, String columnFamily, String columnName) throws Exception{Table table = conn.getTable(tableName);Delete delete = new Delete(Bytes.toBytes(rowKey));//①根据rowKey删除一行数据
    table.delete(delete);//②删除某一行的某一个列簇内容
    delete.addFamily(Bytes.toBytes(columnFamily));//③删除某一行某个列簇某列的值
    delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));table.close();
}

2.5 更新HBase表的列

使用Put api直接替换掉即可

/*** 根据RowKey , 列簇, 列名修改值* @param tableName* @param rowKey* @param columnFamily* @param columnName* @param columnValue* @throws Exception*/
public static void updateData(TableName tableName, String rowKey, String columnFamily, String columnName, String columnValue) throws Exception{Table table = conn.getTable(tableName);Put put1 = new Put(Bytes.toBytes(rowKey));put1.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(columnValue));table.put(put1);table.close();
}

2.6 HBase查询

HBase查询分为get、scan、scan和filter结合。filter过滤器又分为RowFilter(rowKey过滤器)、SingleColumnValueFilter(列值过滤器)、ColumnPrefixFilter(列名前缀过滤器)。

/*** 根据rowKey查询数据* @param tableName* @param rowKey* @throws Exception*/
public static void getResult(TableName tableName, String rowKey) throws Exception{Table table = conn.getTable(tableName);//获得一行Get get = new Get(Bytes.toBytes(rowKey));Result set = table.get(get);Cell[] cells = set.rawCells();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();
}//过滤器 LESS <  LESS_OR_EQUAL <=   EQUAL =   NOT_EQUAL <>   GREATER_OR_EQUAL >=   GREATER >   NO_OP 排除所有/*** @param tableName* @throws Exception*/
public static void scanTable(TableName tableName) throws Exception{Table table = conn.getTable(tableName);//①全表扫描Scan scan1 = new Scan();ResultScanner rscan1 = table.getScanner(scan1);//②rowKey过滤器Scan scan2 = new Scan();//str$ 末尾匹配,相当于sql中的 %str  ^str开头匹配,相当于sql中的str%RowFilter filter = new RowFilter(CompareOperator.EQUAL, new RegexStringComparator("Key1$"));scan2.setFilter(filter);ResultScanner rscan2 = table.getScanner(scan2);//③列值过滤器Scan scan3 = new Scan();//下列参数分别为列族,列名,比较符号,值SingleColumnValueFilter filter3 = new SingleColumnValueFilter(Bytes.toBytes("author"), Bytes.toBytes("name"),CompareOperator.EQUAL, Bytes.toBytes("spark"));scan3.setFilter(filter3);ResultScanner rscan3 = table.getScanner(scan3);//列名前缀过滤器Scan scan4 = new Scan();ColumnPrefixFilter filter4 = new ColumnPrefixFilter(Bytes.toBytes("name"));scan4.setFilter(filter4);ResultScanner rscan4 = table.getScanner(scan4);//过滤器集合Scan scan5 = new Scan();FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);SingleColumnValueFilter filter51 = new SingleColumnValueFilter(Bytes.toBytes("author"), Bytes.toBytes("name"),CompareOperator.EQUAL, Bytes.toBytes("spark"));ColumnPrefixFilter filter52 = new ColumnPrefixFilter(Bytes.toBytes("name"));list.addFilter(filter51);list.addFilter(filter52);scan5.setFilter(list);ResultScanner rscan5 = table.getScanner(scan5);for (Result rs : rscan){String rowKey = Bytes.toString(rs.getRow());System.out.println("row key :" + rowKey);Cell[] cells = rs.rawCells();for (Cell cell: cells){System.out.println(Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) + "::"+ Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + "::"+ Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));}System.out.println("-------------------------------------------");}
}

3.总结

HBase连接的几种方式(二)spark篇 查看Spark上读写HBase

HBase读写的几种方式(三)flink篇  查看flink上读写HBase

github地址:

https://github.com/SwordfallYeung/HBaseDemo

参考资料:

https://hbase.apache.org/book.html

转载于:https://www.cnblogs.com/swordfall/p/10301707.html

HBase读写的几种方式(一)java篇相关推荐

  1. HBase读写的几种方式(三)flink篇

    1. HBase连接的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一 ...

  2. Hbase split的三种方式和split的过程

    Hbase split的三种方式和split的过程https://www.cnblogs.com/niurougan/p/3976519.html 在Hbase中split是一个很重要的功能,Hbas ...

  3. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  4. java直接调用复制文件,java中文件复制的4种方式,java文件的复制

    java中文件复制的4种方式,java文件的复制 今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数 ...

  5. mysql java 日期格式化_(转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  6. python 发送邮件的两种方式【终极篇】

    python 发送邮件的两种方式[终极篇] 一,利用python自带的库 smtplib简单高效 from email.mime.multipart import MIMEMultipart from ...

  7. java文件读写的两种方式

    今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...

  8. java加载properties文件的几种方式,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  9. java excel生成_两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

最新文章

  1. 一步一步学Silverlight 2系列(3):界面布局
  2. 记录一下mathtype输入任意形式矩阵
  3. OPENCV裁剪图片
  4. day-20: 安装软件包及rpm yum的介绍
  5. This is my first CSDN blog
  6. javasript 操作option select
  7. 安卓手机备份_安卓手机数据备份与恢复方法汇总和操作详解
  8. 【面向对象】面向对象程序设计测试题8-对象之间one-to-many关系测试题
  9. RESTful架构与RPC架构
  10. cmd设置mysql初始密码_windows下mysql初始密码设置
  11. 养老金中除以139是什么意思?
  12. Springboot 统一maper 和逆向工程
  13. Arkeia Software宣布支持第100个Linux平台
  14. 如何修改图片大小?图片怎么调整尺寸?
  15. Vue多个元素的过渡
  16. 移动端页面性能优化方案
  17. 【KMP】OKR-Periods of Words
  18. SQLServer STUFF 函数理解
  19. Mobile Edge Computing —— Paper List
  20. QT入门项目--简易计算器

热门文章

  1. 计算机系统操作工五级证件,计算机系统操作工国家职业标准.doc
  2. 第56课 九九乘法表 《小学生C++趣味编程》
  3. C++学习之CodeBlocks安装与调试
  4. sparkstreaming 读取mysql_SparkStreaming读取Kafka的两种方式
  5. Android逆向笔记-通过ApkTool源码分析未能反编译APK的原因
  6. Linux学习笔记-编译与链接的过程
  7. WEB安全基础-HTML+PHP实践
  8. 3.3栈与递归的实现
  9. js导出的xlsx无法打开_vue将数据导出为excel文件就是如此简单
  10. html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客