Hadoop实验03熟悉常用的HBase操作
- 一、 实验目的
- 二、我的环境
- 三、 **实验内容**
- 1) 根据下面给出的表格,用Hbase Shell模式设计student学生表格。
- 2)根据上面已经设计出的student,用Hbase API编程;
- 四、实验代码和结果(截图展示)
🌊 Hbase相关配置参考网址:
😈http://dblab.xmu.edu.cn/blog/install-hbase/
一、 实验目的
1️⃣ 理解HBase在Hadoop体系结构中的角色;
2️⃣ 熟练使用HBase操作常用的Shell命令;
3️⃣ 熟悉HBase操作常用的Java API;
二、我的环境
操作系统:Linux
虚拟机 :ubuntu
Hadoop版本:2.7.1
HBase版本:1.1.2
JDK版本:1.8版本
Java IDE:IDEA
三、 实验内容
1) 根据下面给出的表格,用Hbase Shell模式设计student学生表格。
a) 设计完后,用scan指令浏览表的相关信息,给出截图。
b) 查询zhangsan 的Computer成绩。给出截图。
c) 修改lisi的Math成绩,改为95。给出截图。
⛵️Student 学生表
name | score | ||
English | Math | Computer | |
zhangsan | 69 | 86 | 77 |
lisi | 55 | 100 | 88 |
2)根据上面已经设计出的student,用Hbase API编程;
a) 添加数据:name: mary English:45 Math:89 Computer:100
b) 获取mary的English成绩信息
四、实验代码和结果(截图展示)
1️⃣
A:
B:
C:
2️⃣
a:
b:查看mary英语成绩:
💻代码:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
public class ExampleForHbase{
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
//主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
public static void main(String[] args)throws IOException{
//创建一个表,表名为Score,列族为sname,course
//createTable("xsb",new String[]{"name","course"});
//zhangsan
//insertRow("xsb", "95001", "name", "", "zhangsan");
//insertRow("xsb", "95001", "course", "English", "69");
//insertRow("xsb", "95001", "course", "Math", "86");
//insertRow("xsb", "95001", "course", "Computer", "77");
//lisi
//insertRow("xsb", "95002", "name", "", "lisi");
//insertRow("xsb", "95002", "course", "English", "55");
//insertRow("xsb", "95002", "course", "Math", "100");
//insertRow("xsb", "95002", "course", "Computer", "88");
//查询表中,行键为95001,列族为course,列为Computer的值
//getData("xsb", "95001", "course", "Computer");
//删除表中指定列数据,其行键为95001,列族为course,列为Math
//deleteRow("xsb", "95001", "course", "Math");
//xiu gai
//insertRow("xsb","95001","course","Math","95");
}
//建立连接
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
//关闭连接
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
* @param myTableName 表名
* @param colFamily 列族名
* @throws IOException
*/
public static void createTable(String myTableName,String[] colFamily) throws IOException {
init();
TableName tableName = TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
for(String str:colFamily){
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
hTableDescriptor.addFamily(hColumnDescriptor);
}
admin.createTable(hTableDescriptor);
System.out.println("create table success");
}
close();
}
/**
* 删除指定表
* @param tableName 表名
* @throws IOException
*/
public static void deleteTable(String tableName) throws IOException {
init();
TableName tn = TableName.valueOf(tableName);
if (admin.tableExists(tn)) {
admin.disableTable(tn);
admin.deleteTable(tn);
}
close();
}
/**
* 查看已有表
* @throws IOException
*/
public static void listTables() throws IOException {
init();
HTableDescriptor hTableDescriptors[] = admin.listTables();
for(HTableDescriptor hTableDescriptor :hTableDescriptors){
System.out.println(hTableDescriptor.getNameAsString());
}
close();
}
/**
* 向某一行的某一列插入数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名(如果其列族下没有子列,此参数可为空)
* @param val 值
* @throws IOException
*/
public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
table.put(put);
table.close();
close();
}
/**
* 删除数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/
public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(rowKey.getBytes());
//删除指定列族的所有数据
//delete.addFamily(colFamily.getBytes());
//删除指定列的数据
//delete.addColumn(colFamily.getBytes(), col.getBytes());
table.delete(delete);
table.close();
/**
* 根据行键rowkey查找数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/ close();
}
public static void getData(String tableName,String rowKey,String colFamily,String col)throws IOException{
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
showCell(result);
table.close();
close();
}
/**
* 格式化输出
* @param result
*/
public static void showCell(Result result){
Cell[] cells = result.rawCells();
for(Cell cell:cells){
System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
System.out.println("Timetamp:"+cell.getTimestamp()+" ");
System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
}
}
}