java hbase 更新数据_使用终端和Java API对hbase进行增删改查操作

本文通过在Linux终端和Eclipse中使用Java API,详细介绍了如何对HBase进行增删改查操作,包括创建表、添加数据、删除数据、查看数据等,并展示了相关代码示例。
摘要由CSDN通过智能技术生成

一、 实验目的

本次实验通过使用终端和Java API对hbase进行增删改查操作,学习非关系型数据库的结构以及如何操作,理解非关系型数据库与关系数据库的对比,掌握如何使用菲关系型数据库hbase。

二、 实验内容

尽可能完成老师给出的内容,做了多少就写多少

三、 实验思路、结构

先在Linux命令行的方式下实现在hbase中建表,增删改查操作

然后再使用Elipse利用Java编程实现在hbase中建表,增删改查操作。

四、 实验结果

HBase中用create命令创建表,具体如下:

47e58d53abbdcd000f6b62e52aec97a6.png

此时,即创建了一个“student”表,属性有:Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。创建完“student”表后,可通过describe命令查看“student”表的基本信息。命令执行截图如下:

2ad5e4a755d0d2adbf5f515aca98e6c6.png

然后执行HBase的增删改查操作。在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。

1.添加数据

HBase中用put命令添加数据,注意:一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据,所以直接用shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。

51903ad4bfb9ffff5083714af14067c9.png

此时为student表添加了学号为95001,名字为LiYing的一行数据,其行键为95001。因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。

920038b5546cf69d8b22a9bc2ce1424d.png

此时即为95001行下的course列族的math列添加了一个数据。

2.删除数据

在HBase中用delete以及deleteall命令进行删除数据操作,它们的区别是:1. delete用于删除一个数据,是put的反向操作;2. deleteall操作用于删除一行数据。

ac16b09e0690b726a1a92fbdbfc0a47d.png

此时删除了student表中95001行下的Ssex列的所有数据。

deleteall命令

ae667fefd1fc50954670e6f5ba6f5832.png

Deleteall ‘student’, ‘95001’命令删除了95001行的所有列,即该行的全部数据。

3.查看数据

HBase中有两个用于查看数据的命令:1. get命令,用于查看表的某一行数据;2. scan命令用于查看某个表的全部数据。

get命令

efc02c9cfd7d2def9468ca6e0b37bd5c.png

返回的是‘student’表‘95001’行的数据。

scan命令

f523d7fe89b346484aad1b4bacc118e8.png

此时返回的是’student’表的全部数据。

还可以查询标的历史数据

查询表的历史版本,需要两步。

(1).在创建表的时候,指定保存的版本数(假设指定为5)

(2).插入数据然后更新数据,使其产生历史版本数据,注意:这里插入数据和更新数据都是用put命令

(3).查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)

99c2a1862eeb2bce8c3ffc429136a503.png

4.删除表

删除表有两步,第一步先让该表不可用,第二步删除表。

19b8eb2fbd77d2e39620ed90c333930c.png

使用Elipse编程实现对hbase的增删改查

代码为:

1 importorg.apache.hadoop.conf.Configuration;2 import org.apache.hadoop.hbase.*;3 import org.apache.hadoop.hbase.client.*;4 importjava.io.IOException;5

6 public classExampleForHbase7 {8 public staticConfiguration configuration;9 public staticConnection connection;10 public staticAdmin admin;11

12 //主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释

13 public static void main(String[] args)throwsIOException14 {15 //创建一个表,表名为Score,列族为sname,course16 //createTable("Score",new String[]{"sname","course"});17

18 //在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)19 //等价命令:put 'Score','95001','sname','Mary'20 //insertRow("Score", "95001", "sname", "", "Mary");21 //在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列)22 //等价命令:put 'Score','95001','score:Math','88'23 //insertRow("Score", "95001", "course", "Math", "88");24 //在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列)25 //等价命令:put 'Score','95001','score:English','85'26 //insertRow("Score", "95001", "course", "English", "85");27

28 //1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math29 //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释30 //等价命令:delete 'Score','95001','score:Math'31 //deleteRow("Score", "95001", "course", "Math");32

33 //2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)34 //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释35 //等价命令:delete 'Score','95001','score'36 //deleteRow("Score", "95001", "course", "");37

38 //3、删除Score表中指定行数据,其行键为9500139 //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释40 //等价命令:deleteall 'Score','95001'41 //deleteRow("Score", "95001", "", "");42

43 //查询Score表中,行键为95001,列族为course,列为Math的值44 //getData("Score", "95001", "course", "Math");45 //查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)46 //getData("Score", "95001", "sname", "");47

48 //删除Score表49 //deleteTable("Score");

50 }51

52 //建立连接

53 public static voidinit()54 {55 configuration =HBaseConfiguration.create();56 configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");57 try

58 {59 connection =ConnectionFactory.createConnection(configuration);60 admin =connection.getAdmin();61 }62 catch(IOException e)63 {64 e.printStackTrace();65 }66 }67 //关闭连接

68 public static voidclose()69 {70 try

71 {72 if(admin != null)73 {74 admin.close();75 }76 if(null !=connection)77 {78 connection.close();79 }80 }81 catch(IOException e)82 {83 e.printStackTrace();84 }85 }86

87 /**

88 * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列89 *@parammyTableName 表名90 *@paramcolFamily 列族名91 *@throwsIOException92 */

93 public static void createTable(String myTableName,String[] colFamily) throwsIOException94 {95

96 init();97 TableName tableName =TableName.valueOf(myTableName);98

99 if(admin.tableExists(tableName))100 {101 System.out.println("talbe is exists!");102 }103 else

104 {105 HTableDescriptor hTableDescriptor = newHTableDescriptor(tableName);106 for(String str:colFamily)107 {108 HColumnDescriptor hColumnDescriptor = newHColumnDescriptor(str);109 hTableDescriptor.addFamily(hColumnDescriptor);110 }111 admin.createTable(hTableDescriptor);112 System.out.println("create table success");113 }114 close();115 }116 /**

117 * 删除指定表118 *@paramtableName 表名119 *@throwsIOException120 */

121 public static void deleteTable(String tableName) throwsIOException122 {123 init();124 TableName tn =TableName.valueOf(tableName);125 if(admin.tableExists(tn))126 {127 admin.disableTable(tn);128 admin.deleteTable(tn);129 }130 close();131 }132

133 /**

134 * 查看已有表135 *@throwsIOException136 */

137 public static void listTables() throwsIOException138 {139 init();140 HTableDescriptor hTableDescriptors[] =admin.listTables();141 for(HTableDescriptor hTableDescriptor :hTableDescriptors)142 {143 System.out.println(hTableDescriptor.getNameAsString());144 }145 close();146 }147 /**

148 * 向某一行的某一列插入数据149 *@paramtableName 表名150 *@paramrowKey 行键151 *@paramcolFamily 列族名152 *@paramcol 列名(如果其列族下没有子列,此参数可为空)153 *@paramval 值154 *@throwsIOException155 */

156 public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throwsIOException157 {158 init();159 Table table =connection.getTable(TableName.valueOf(tableName));160 Put put = newPut(rowKey.getBytes());161 put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());162 table.put(put);163 table.close();164 close();165 }166

167 /**

168 * 删除数据169 *@paramtableName 表名170 *@paramrowKey 行键171 *@paramcolFamily 列族名172 *@paramcol 列名173 *@throwsIOException174 */

175 public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throwsIOException176 {177 init();178 Table table =connection.getTable(TableName.valueOf(tableName));179 Delete delete = newDelete(rowKey.getBytes());180 //删除指定列族的所有数据181 //delete.addFamily(colFamily.getBytes());182 //删除指定列的数据183 //delete.addColumn(colFamily.getBytes(), col.getBytes());

184

185 table.delete(delete);186 table.close();187 close();188 }189 /**

190 * 根据行键rowkey查找数据191 *@paramtableName 表名192 *@paramrowKey 行键193 *@paramcolFamily 列族名194 *@paramcol 列名195 *@throwsIOException196 */

197 public static void getData(String tableName,String rowKey,String colFamily,String col)throwsIOException198 {199 init();200 Table table =connection.getTable(TableName.valueOf(tableName));201 Get get = newGet(rowKey.getBytes());202 get.addColumn(colFamily.getBytes(),col.getBytes());203 Result result =table.get(get);204 showCell(result);205 table.close();206 close();207 }208 /**

209 * 格式化输出210 *@paramresult211 */

212 public static voidshowCell(Result result)213 {214 Cell[] cells =result.rawCells();215 for(Cell cell:cells)216 {217 System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");218 System.out.println("Timetamp:"+cell.getTimestamp()+" ");219 System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");220 System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");221 System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");222 }223 }224 }

建表成功

c2675ca68d8f3ba8ddf59afad9572463.png

在执行完代码中的所有插入操作以后可以看到表中数据为:

cca2b57f6a8e43d2e04350ec0f843b9b.png

执行三个不同层次的删除操作后表中已经没有数据了

96f4c95dcd2d8faaebc5cce7d08f480d.png

再重新执行一个插入数据的操作

然后执行第一个getData操作

f00adf34954dc44fbb30d8cfb4e3cada.png

再执行第二个getData操作

0590b9e58c3f554554d88f5a6a72a1f7.png

最后删除表。

五、 心得体会

做实验的时候要细心,注意具体导入的是哪个地方的jar包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值