Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询

1、搭建环境

新建JAVA项目,添加的包有:

有关Hadoop的hadoop-core-0.20.204.0.jar

有关Hbase的hbase-0.90.4.jar、hbase-0.90.4-tests.jar以及Hbase资源包中lib目录下的所有jar包

2、主要程序

Java代码

  1. package com.wujintao.hbase.test;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.hbase.HBaseConfiguration;
  7. import org.apache.hadoop.hbase.HColumnDescriptor;
  8. import org.apache.hadoop.hbase.HTableDescriptor;
  9. import org.apache.hadoop.hbase.KeyValue;
  10. import org.apache.hadoop.hbase.MasterNotRunningException;
  11. import org.apache.hadoop.hbase.ZooKeeperConnectionException;
  12. import org.apache.hadoop.hbase.client.Delete;
  13. import org.apache.hadoop.hbase.client.Get;
  14. import org.apache.hadoop.hbase.client.HBaseAdmin;
  15. import org.apache.hadoop.hbase.client.HTable;
  16. import org.apache.hadoop.hbase.client.HTablePool;
  17. import org.apache.hadoop.hbase.client.Put;
  18. import org.apache.hadoop.hbase.client.Result;
  19. import org.apache.hadoop.hbase.client.ResultScanner;
  20. import org.apache.hadoop.hbase.client.Scan;
  21. import org.apache.hadoop.hbase.filter.Filter;
  22. import org.apache.hadoop.hbase.filter.FilterList;
  23. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  24. import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
  25. import org.apache.hadoop.hbase.util.Bytes;
  26. public class JinTaoTest {
  27. public static Configuration configuration;
  28. static {
  29. configuration = HBaseConfiguration.create();
  30. configuration.set("hbase.zookeeper.property.clientPort", "2181");
  31. configuration.set("hbase.zookeeper.quorum", "192.168.1.100");
  32. configuration.set("hbase.master", "192.168.1.100:600000");
  33. }
  34. public static void main(String[] args) {
  35. // createTable("wujintao");
  36. // insertData("wujintao");
  37. // QueryAll("wujintao");
  38. // QueryByCondition1("wujintao");
  39. // QueryByCondition2("wujintao");
  40. //QueryByCondition3("wujintao");
  41. //deleteRow("wujintao","abcdef");
  42. deleteByCondition("wujintao","abcdef");
  43. }
  44. /**
  45. * 创建表
  46. * @param tableName
  47. */
  48. public static void createTable(String tableName) {
  49. System.out.println("start create table ......");
  50. try {
  51. HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration);
  52. if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  53. hBaseAdmin.disableTable(tableName);
  54. hBaseAdmin.deleteTable(tableName);
  55. System.out.println(tableName + " is exist,detele....");
  56. }
  57. HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
  58. tableDescriptor.addFamily(new HColumnDescriptor("column1"));
  59. tableDescriptor.addFamily(new HColumnDescriptor("column2"));
  60. tableDescriptor.addFamily(new HColumnDescriptor("column3"));
  61. hBaseAdmin.createTable(tableDescriptor);
  62. } catch (MasterNotRunningException e) {
  63. e.printStackTrace();
  64. } catch (ZooKeeperConnectionException e) {
  65. e.printStackTrace();
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. }
  69. System.out.println("end create table ......");
  70. }
  71. /**
  72. * 插入数据
  73. * @param tableName
  74. */
  75. public static void insertData(String tableName) {
  76. System.out.println("start insert data ......");
  77. HTablePool pool = new HTablePool(configuration, 1000);
  78. HTable table = (HTable) pool.getTable(tableName);
  79. Put put = new Put("112233bbbcccc".getBytes());// 一个PUT代表一行数据,再NEW一个PUT表示第二行数据,每行一个唯一的ROWKEY,此处rowkey为put构造方法中传入的值
  80. put.add("column1".getBytes(), null, "aaa".getBytes());// 本行数据的第一列
  81. put.add("column2".getBytes(), null, "bbb".getBytes());// 本行数据的第三列
  82. put.add("column3".getBytes(), null, "ccc".getBytes());// 本行数据的第三列
  83. try {
  84. table.put(put);
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. System.out.println("end insert data ......");
  89. }
  90. /**
  91. * 删除一张表
  92. * @param tableName
  93. */
  94. public static void dropTable(String tableName) {
  95. try {
  96. HBaseAdmin admin = new HBaseAdmin(configuration);
  97. admin.disableTable(tableName);
  98. admin.deleteTable(tableName);
  99. } catch (MasterNotRunningException e) {
  100. e.printStackTrace();
  101. } catch (ZooKeeperConnectionException e) {
  102. e.printStackTrace();
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. /**
  108. * 根据 rowkey删除一条记录
  109. * @param tablename
  110. * @param rowkey
  111. */
  112. public static void deleteRow(String tablename, String rowkey)  {
  113. try {
  114. HTable table = new HTable(configuration, tablename);
  115. List list = new ArrayList();
  116. Delete d1 = new Delete(rowkey.getBytes());
  117. list.add(d1);
  118. table.delete(list);
  119. System.out.println("删除行成功!");
  120. } catch (IOException e) {
  121. e.printStackTrace();
  122. }
  123. }
  124. /**
  125. * 组合条件删除
  126. * @param tablename
  127. * @param rowkey
  128. */
  129. public static void deleteByCondition(String tablename, String rowkey)  {
  130. //目前还没有发现有效的API能够实现 根据非rowkey的条件删除 这个功能能,还有清空表全部数据的API操作
  131. }
  132. /**
  133. * 查询所有数据
  134. * @param tableName
  135. */
  136. public static void QueryAll(String tableName) {
  137. HTablePool pool = new HTablePool(configuration, 1000);
  138. HTable table = (HTable) pool.getTable(tableName);
  139. try {
  140. ResultScanner rs = table.getScanner(new Scan());
  141. for (Result r : rs) {
  142. System.out.println("获得到rowkey:" + new String(r.getRow()));
  143. for (KeyValue keyValue : r.raw()) {
  144. System.out.println("列:" + new String(keyValue.getFamily())
  145. + "====值:" + new String(keyValue.getValue()));
  146. }
  147. }
  148. } catch (IOException e) {
  149. e.printStackTrace();
  150. }
  151. }
  152. /**
  153. * 单条件查询,根据rowkey查询唯一一条记录
  154. * @param tableName
  155. */
  156. public static void QueryByCondition1(String tableName) {
  157. HTablePool pool = new HTablePool(configuration, 1000);
  158. HTable table = (HTable) pool.getTable(tableName);
  159. try {
  160. Get scan = new Get("abcdef".getBytes());// 根据rowkey查询
  161. Result r = table.get(scan);
  162. System.out.println("获得到rowkey:" + new String(r.getRow()));
  163. for (KeyValue keyValue : r.raw()) {
  164. System.out.println("列:" + new String(keyValue.getFamily())
  165. + "====值:" + new String(keyValue.getValue()));
  166. }
  167. } catch (IOException e) {
  168. e.printStackTrace();
  169. }
  170. }
  171. /**
  172. * 单条件按查询,查询多条记录
  173. * @param tableName
  174. */
  175. public static void QueryByCondition2(String tableName) {
  176. try {
  177. HTablePool pool = new HTablePool(configuration, 1000);
  178. HTable table = (HTable) pool.getTable(tableName);
  179. Filter filter = new SingleColumnValueFilter(Bytes
  180. .toBytes("column1"), null, CompareOp.EQUAL, Bytes
  181. .toBytes("aaa")); // 当列column1的值为aaa时进行查询
  182. Scan s = new Scan();
  183. s.setFilter(filter);
  184. ResultScanner rs = table.getScanner(s);
  185. for (Result r : rs) {
  186. System.out.println("获得到rowkey:" + new String(r.getRow()));
  187. for (KeyValue keyValue : r.raw()) {
  188. System.out.println("列:" + new String(keyValue.getFamily())
  189. + "====值:" + new String(keyValue.getValue()));
  190. }
  191. }
  192. } catch (Exception e) {
  193. e.printStackTrace();
  194. }
  195. }
  196. /**
  197. * 组合条件查询
  198. * @param tableName
  199. */
  200. public static void QueryByCondition3(String tableName) {
  201. try {
  202. HTablePool pool = new HTablePool(configuration, 1000);
  203. HTable table = (HTable) pool.getTable(tableName);
  204. List<Filter> filters = new ArrayList<Filter>();
  205. Filter filter1 = new SingleColumnValueFilter(Bytes
  206. .toBytes("column1"), null, CompareOp.EQUAL, Bytes
  207. .toBytes("aaa"));
  208. filters.add(filter1);
  209. Filter filter2 = new SingleColumnValueFilter(Bytes
  210. .toBytes("column2"), null, CompareOp.EQUAL, Bytes
  211. .toBytes("bbb"));
  212. filters.add(filter2);
  213. Filter filter3 = new SingleColumnValueFilter(Bytes
  214. .toBytes("column3"), null, CompareOp.EQUAL, Bytes
  215. .toBytes("ccc"));
  216. filters.add(filter3);
  217. FilterList filterList1 = new FilterList(filters);
  218. Scan scan = new Scan();
  219. scan.setFilter(filterList1);
  220. ResultScanner rs = table.getScanner(scan);
  221. for (Result r : rs) {
  222. System.out.println("获得到rowkey:" + new String(r.getRow()));
  223. for (KeyValue keyValue : r.raw()) {
  224. System.out.println("列:" + new String(keyValue.getFamily())
  225. + "====值:" + new String(keyValue.getValue()));
  226. }
  227. }
  228. rs.close();
  229. } catch (Exception e) {
  230. e.printStackTrace();
  231. }
  232. }
  233. }

注意:可能大家没看到更新数据的操作,其实更新的操作跟添加完全一致,只不过是添加呢rowkey不存在,更新呢rowkey已经存在,并且timstamp相同的情况下,还有就是目前好像还没办法实现hbase数据的分页查询,不知道有没有人知道怎么做

HBase性能优化建议:

 针对前面的代码,有很多不足之处,在此我就不修改上面的代码了,只是提出建议的地方,大家自己加上

1)配置

当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置 文件都存在并且都设置好了相应参上面的属性下面的属性即可

2)关于建表

public void createTable(HTableDescriptor desc)

HTableDescriptor 代表的是表的schema, 提供的方法中比较有用的有

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

增加family通过 addFamily方法

public void addFamily(final HColumnDescriptor family)

HColumnDescriptor代表的是column的schema,提供的方法比较常用的有

setTimeToLive:指定最大的TTL,单位是ms,过期数据会被自动删除。

setInMemory:指定是否放在内存中,对小表有用,可用于提高效率。默认关闭

setBloomFilter:指定是否使用BloomFilter,可提高随机查询效率。默认关闭

setCompressionType:设定数据压缩类型。默认无压缩。

setMaxVersions:指定数据最大保存的版本个数。默认为3。

注意的是,一般我们不去setInMemory为true,默认是关闭的

3)关于入库

官方建议

table.setAutoFlush(false); //数据入库之前先设置此项为false

table.setflushCommits();//入库完成后,手动刷入数据

注意:

在入库过程中,put.setWriteToWAL(true/flase);

关于这一项如果不希望大量数据在存储过程中丢失,建议设置为true,如果仅是在测试演练阶段,为了节省入库时间建议设置为false

4)关于获取表实例

HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);

HTable table = (HTable) pool.getTable(tableName);

建议用表连接池的方式获取表,具体池有什么作用,我想用过数据库连接池的同学都知道,我就不再重复

不建议使用new HTable(configuration,tableName);的方式获取表

5)关于查询

建议每个查询语句都放入try catch语句块,并且finally中要进行关闭ResultScanner实例以及将不使用的表重新放入到HTablePool中的操作,具体做法如下

Java代码

  1. public static void QueryAll(String tableName) {
  2. HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);
  3. HTable table = null;
  4. ResultScanner rs = null;
  5. try {
  6. Scan scan = new Scan();
  7. table = (HTable) pool.getTable(tableName);
  8. rs = table.getScanner(scan);
  9. for (Result r : rs) {
  10. System.out.println("获得到rowkey:" + new String(r.getRow()));
  11. for (KeyValue keyValue : r.raw()) {
  12. System.out.println("列:" + new String(keyValue.getFamily())
  13. + "====值:" + new String(keyValue.getValue()));
  14. }
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }finally{
  19. rs.close();// 最后还得关闭
  20. pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)
  21. }
  22. }

所以,以上代码有缺陷的地方,感兴趣的同学可以针对优化建议作出相应修改

时间: 2024-12-23 15:02:58

Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询的相关文章

ios CoreData框架的使用,对上下文数据的增删改查,表与表之间的关联,1对多,1对1,谓词查询,多表连接

这里是只是代码,因为博客插入图片效果不是很好,我自己写的总结比较详细,有兴趣的朋友可以在评论里留下邮箱,我收到后会发给大家. 转载注明出处,重视原创者的劳动成果,谢谢! - (void)viewDidLoad { [super viewDidLoad]; [self _creatTable];//插入数据 //    [self _query];// 查询数据 // KVC很霸道,即使readonly通过kvc也可赋值,kvo精华 //    Book * book = [[Book alloc

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有):又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便:于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便. 原理: 1.利用

Android(java)学习笔记245:ContentProvider之银行数据库创建和增删改查的实现

1.Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentProvider  内容提供者 2. ContentProvider  内容提供者 用途:把应用程序私有的数据暴露给别的应用程序. 3.下面通过一个银行数据库创建和增删改查的实现案例说明ContentProvider的使用: (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenH

Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]

在Yii的开发中常常需要去使用Yii的增删改查方法,这些方法又可以多次变化和组合,带来全方位的实现对数据库的处理,下面对这些方法做一些简单的整理和梳理,有遗漏或是BUG,敬请指出.灰常感谢!!! 一.查询数据集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //1.该方法是根据一个条件查询一个集合 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->f

java使用原生MySQL实现数据的增删改查

一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> 1.2 jdbc.propert

mysql--对行(表中数据)的增删改查

一.插入数据(增加)insert 1.插入数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); #指定字段来插入数据,插入的值要和你前面的字段相匹配 语法二: INSERT INTO 表名 VALUES (值1,值2,值3-值n); #不指定字段的话,就按照默认的几个字段来插入数据 2.指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3-) VALUES (值1,值2,值3-); 3.插入

五表联查sql和复选框 增删改查

这是五表联查的效果图,如果这个不明显,那么用添加说话 这样就明显了把 这个送餐时间和地点,都是一对多的,那么这个菜单就是多对多,其实对于老鸟来说没有什么大不了,但是对于新手,我希望还是可以有点帮助的,这个是用Mybatis写的 首先我们先把sql给贡献出来,或许有些丑,不过,这反正也是给自己写的随笔无所谓了 select a.*,b.fname from    (select a.*,c.aname from (select a.*,b.name tname from    t_order a,

利用PHP连接数据库——实现用户数据的增删改查的整体操作实例

main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspacing="0"><tr><td>代号</td><td>姓名</td><td>性别</td><td>民族</td><td>生日</td><td>