大数据实验三熟悉常用的HBase操作----代码

2120011013刘百胜

(一)编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务

(1)列出HBase所有的表的相关信息,例如表名

package one;

import java.io.IOException;

public class Test_1 {

    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
   
    //建立连接
    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();
        }
    }
    
 
    public static void listTables() throws IOException {
        init();
        HTableDescriptor hTableDescriptors[] = admin.listTables();
        for(HTableDescriptor hTableDescriptor :hTableDescriptors){
            System.out.println(hTableDescriptor.getNameAsString());
        }
        close();
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test_1 t =new Test_1();
        try {
            System.out.println("以下为Hbase 数据库中所存的表信息");
            t.listTables();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      
    }

}

(2)在终端打印出指定的表的所有记录数据

package one;

import java.io.IOException;


public class Test_2 {

    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
  
    
  //建立连接
    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();
        }
    }
  
   
    public static void getData(String tableName)throws  IOException{
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
       ResultScanner scanner = table.getScanner(scan);
        
        for(Result result:scanner)
        {
            showCell((result));
        }
        close();
    }
    
   
    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("column Name(列名):"+new String(CellUtil.cloneQualifier(cell))+" ");
            System.out.println("value:(值)"+new String(CellUtil.cloneValue(cell))+" ");
            System.out.println();
        }
    }
    
    
    
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Test_2 t =new Test_2();
        System.out.println("请输入要查看的表名");
        Scanner scan = new Scanner(System.in);
        String tableName=scan.nextLine();
        System.out.println("信息如下:");
        t.getData(tableName);

    }

}

(3)向已经创建好的表添加和删除指定的列族或列

package one;

import java.io.IOException;

public class Test_3 {

    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
      //建立连接
    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();
        }
    }
    
  
    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();
    } 
    
  
    public static void getData(String tableName)throws  IOException{
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
       ResultScanner scanner = table.getScanner(scan);
        
        for(Result result:scanner)
        {
            showCell((result));
        }
        close();
    }
    

    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("column Name(列名):"+new String(CellUtil.cloneQualifier(cell))+" ");
            System.out.println("value:(值)"+new String(CellUtil.cloneValue(cell))+" ");
            System.out.println();
        }
    }
    
  
    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());
       
        boolean flag2 =true;
        while(flag2)
        {
        System.out.println("请输入你的选择 1-删除列族的所有数据  2-指定列的数据");
        Scanner scanner=new Scanner(System.in);
        String chooseString = scanner.nextLine();
        switch (chooseString) {
        case "1":
        {
            //删除指定列族的所有数据
            delete.addFamily(colFamily.getBytes());
            table.delete(delete);
            table.close();
            close();
            break;
        }
        case "2":
        {
            //删除指定列的数据
            delete.addColumn(colFamily.getBytes(), col.getBytes());
            table.delete(delete);
            table.close();
            close();
            break;
        }

        default:
        {
            System.out.println("   你的输入有误 !!!    ");
            table.close();
            close();
            break;
        }
        }
        System.out.println(" 你要继续操作吗? 是-true 否-false ");
        flag2=scanner.nextBoolean();
        }
    }
    
    
    public static void main(String[] args) {
        Test_3 t =new Test_3();
        boolean flag =true;
        while(flag)
        {
        System.out.println("---向已经创建好的表中添加和删除指定的列簇或列----------------");
        System.out.println("    请输入您要进行的操作   1- 添加       2-删除             ");
        Scanner scan = new Scanner(System.in);
        String choose1=scan.nextLine();
        switch (choose1) {
        case "1":
        {
            System.out.println("请输入要添加的表名");
            String tableName=scan.nextLine();
            System.out.println("请输入要添加的表的行键");
            String rowKey=scan.nextLine();
            System.out.println("请输入要添加的表的列簇");
            String colFamily=scan.nextLine();
            System.out.println("请输入要添加的表的列名");
            String col=scan.nextLine();
            System.out.println("请输入要添加的值");
            String val=scan.nextLine();
            try {
                t.insertRow(tableName, rowKey, colFamily, col, val);
                System.out.println("插入成功:");
                t.getData(tableName);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.getMessage();
            }
            break;
        }
         case "2":
         {
                System.out.println("请输入要删除的表名");
                String tableName=scan.nextLine();
                System.out.println("请输入要删除的表的行键");
                String rowKey=scan.nextLine();
                System.out.println("请输入要删除的表的列簇");
                String colFamily=scan.nextLine();
                System.out.println("请输入要删除的表的列名");
                String col=scan.nextLine();
                try {
                    System.out.println("----------表的原本信息如下---------------------");
                    t.getData(tableName);
                    System.out.println("----------------正在执行删除操作........\n");
                    t.deleteRow(tableName, rowKey, colFamily, col);
                    System.out.println("----------删除成功--------\n");
                    System.out.println("-------删除后  表的信息如下---------------------");
                    t.getData(tableName);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.getMessage();
                }
            break;
         }
        default:
        {
            System.out.println("   你的操作有误 !!!    ");
            break;
        }
        }
        System.out.println(" 你要继续操作吗? 是-true 否-false ");
        flag=scan.nextBoolean();
        
        }
        System.out.println("   程序已退出!    ");
    }

}

(4)清空指定的表的所有记录数据

package one;

import java.io.IOException;


public class Test_4 {

    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
  
    
  //建立连接
    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();
        }
    }

   
    
    
 
    public static void clearRows(String tableName) throws IOException{
        
        init();
         
        TableName tablename=TableName.valueOf(tableName);
        
        //删除表
        admin.disableTable(tablename);
        admin.deleteTable(tablename);
        
        //重新建表
        // admin.createTable(tDescriptor);
        close();

    }   

     
    public static void getData(String tableName)throws  IOException{
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
       ResultScanner scanner = table.getScanner(scan);
        
        for(Result result:scanner)
        {
            showCell((result));
        }
        close();
    }
     
    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("column Name(列名):"+new String(CellUtil.cloneQualifier(cell))+" ");
            System.out.println("value:(值)"+new String(CellUtil.cloneValue(cell))+" ");
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        
        Test_4 test_4=new Test_4();
        
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要清空的表名");
        String tableName=scan.nextLine();

        try {
            System.out.println("表原来的信息:");
            test_4.getData(tableName);
            test_4.clearRows(tableName);
            System.out.println("表已清空:");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

(5)统计表的行数

package one;

import java.io.IOException;

public class Test_55{
    
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
    //建立连接
    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();
        }
    }
 
     public static void countRows (String tableName) throws IOException
     {
         init();
         Table table = connection.getTable(TableName.valueOf(tableName));
         Scan scan = new Scan();
         ResultScanner scanner =table.getScanner(scan);
         int num = 0;
         for(Result result = scanner.next();result!=null;result=scanner.next())
         {
             num++;
         }
         System.out.println("行数:"+num);
         scanner.close();
         close();
     }
    
  
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Test_55 test_5=new Test_55();
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要统计行数的表名");
        String tableName=scan.nextLine();
        test_5.countRows(tableName);
    }

}

(二)HBase数据库操作

1)createTable(String tableName, String[] fields)

创建表,参数tableName为表的名称,字符串数组fields为存储记录各个域名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。

import org.apache.hadoop.conf.Configuration;

public class CreateTable {
	public static Configuration configuration;
	public static Connection connection;
	public static Admin admin;
	
	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(connection != null){
				connection.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	public static void createTable(String tableName,String[] fields) throws IOException{
		init();
		TableName tablename = TableName.valueOf(tableName);//定义表名
		if(admin.tableExists(tablename)){
			System.out.println("table is exists!");
			admin.disableTable(tablename);
			admin.deleteTable(tablename);
		}
		TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tablename);
		for(int i=0;i<fields.length;i++){
			ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(fields[i])).build();
			tableDescriptor.setColumnFamily(family);
		}
		admin.createTable(tableDescriptor.build());
		close();
	}
	public static void main(String[] args){
		String[] fields = {"id","score"};
		try{
			createTable("test",fields);
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

2)addRecord(String tableName, String row, String[] fields, String[] values)

向表tableName、行row(用S_Name表示)和字符串数组files指定的单元格中添加对应的数据values。其中fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”、“Computer Science”、“English”三列添加成绩时,字符串数组fields为{“Score:Math”,”Score;Computer Science”,”Score:English”},数组values存储这三门课的成绩。


import org.apache.hadoop.conf.Configuration;

public class AddRecord {
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;

    public static void addRecord(String tableName, String row, String[] fields, String[] values) throws IOException {
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        for (int i = 0; i != fields.length; i++) {
            Put put = new Put(row.getBytes());
            String[] cols = fields[i].split(":");
            put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());
            table.put(put);
        }
        table.close();
        close();
    }

    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();
        }
    }

    public static void main(String[] args) {
        String[] fields = {"Score:Math", "Score:Computer Science", "Score:English"};
        String[] values = {"99", "80", "100"};
        try {
            addRecord("person", "Score", fields, values);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


3)scanColumn(String tableName, String column)

浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。要求当参数column为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。

import java.io.IOException;


public class scanColumn {
	public static Configuration configuration;
	public static Connection connection;
	public static Admin admin;
	
	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(connection != null){
				connection.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	public static void showResult(Result result){
		Cell[] cells = result.rawCells();
		for(int i=0;i<cells.length;i++){
			System.out.println("RowName:"+new String(CellUtil.cloneRow(cells[i])));
			System.out.println("ColumnName:"+new String(CellUtil.cloneQualifier(cells[i])));//打印列名
			System.out.println("Value:"+new String(CellUtil.cloneValue(cells[i])));
			System.out.println("Column Family:"+new String(CellUtil.cloneFamily(cells[i])));//打印列簇
			System.out.println();
		}
	}
	public static void scanColumn(String tableName,String column){
		init();
		try {
			Table table = connection.getTable(TableName.valueOf(tableName));
			Scan scan  = new Scan();
			scan.addFamily(Bytes.toBytes(column));
			ResultScanner scanner = table.getScanner(scan);
			for(Result result = scanner.next();result != null;result = scanner.next()){
				showResult(result);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally{
			close();
		}
	}
	public static void main(String[] args){
		scanColumn("Student","S_Age");
	}
}

4)modifyData(String tableName, String row, String column)

修改表tableName,行row(可以用学生姓名S_Name表示),列column指定的单元格的数据。


import java.io.IOException;


public class modifyData {
	public static Configuration configuration;
	public static Connection connection;
	public static Admin admin;
	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(connection != null){
				connection.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	public static void modifyData(String tableName,String row,String column,String value) throws IOException{
		init();
		Table table = connection.getTable(TableName.valueOf(tableName));
		Put put = new Put(row.getBytes());
		String[] cols = column.split(":");
		if(cols.length == 1){
			put.addColumn(column.getBytes(),"".getBytes(), value.getBytes());
		}
		else{
			put.addColumn(cols[0].getBytes(), cols[1].getBytes(), value.getBytes());
		}
		table.put(put);
		close();
	}
	public static void main(String[] args){
		try{
			modifyData("Student","1","S_Name","Tom");
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
}

5)deleteRow(String tableName, String row)

删除表tableName中row指定的行的记录。


import java.io.IOException;


public class deleteRow {
	public static Configuration configuration;
	public static Connection connection;
	public static Admin admin;
	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(connection != null){
				connection.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	public static void deleteRow(String tableName,String row) throws IOException{
		init();
		Table table = connection.getTable(TableName.valueOf(tableName));
		Delete delete = new Delete(row.getBytes());
		table.delete(delete);
		close();
	}
	public static void main(String[] args){
		try{
			deleteRow("Student","3");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值