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:

熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_System


熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_大数据_02

B:

熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_hadoop_03

C:

熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_大数据_04


熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_熟悉常用的HBase操作实验心得_05

2️⃣

a:

熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_熟悉常用的HBase操作实验心得_06


熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_hadoop_07

b:查看mary英语成绩:

熟悉常用的HBase操作实验心得 实验三 熟悉常用的hbase操作_熟悉常用的HBase操作实验心得_08

💻代码:

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))+" ");
        }
    }
}