HbaseAPI操作之DDL与DML

一、导入依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>2.0.5</version>
        <exclusions>
            <exclusion>
                <groupId>org.glassfish</groupId>
                <artifactId>javax.el</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.0.5</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b06</version>
    </dependency>
</dependencies>

二、DDL

package com.hpu;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.NamespaceExistException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author LS
 * @date 2022/1/4 11:44
 * @description
 */
public class hbase_DDL {
    //单例连接
    public static Connection connection = null;

    static {
        //创建连接的配置对象
        Configuration conf = new Configuration();
        conf.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
        try {
            //创建连接
            connection = ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            System.out.println("初始化连接错误");
        }
    }

    public static void close() throws IOException {
        if (connection != null) {
            connection.close();
        }
    }

    //创建命名空间
    public static void createNamespace(String namespace) throws IOException {
        //获取admin
        Admin admin = connection.getAdmin();
        //调用方法创建命名空间
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);
        //对命名空间添加自定义的键值对
        builder.addConfiguration("user", "atguigu");
        try {
            admin.createNamespace(builder.build());
        } catch (NamespaceExistException e) {
            System.out.println("命名空间已经存在");
        } catch (IOException e) {
            e.printStackTrace();
        }
        admin.close();
    }

    //判断表是否存在
    public static boolean isTableExists(String namespace, String tableName) throws IOException {
        Admin admin = connection.getAdmin();
        boolean b = false;

        try {
            b = admin.tableExists(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        admin.close();
        return b;
    }

    //创建表
    public static void createTable(String namespace,String tableName,String... families) throws IOException {
        if (families.length == 0){
            System.out.println("需要一个列族");
            return;
        }
        if (isTableExists(namespace,tableName)){
            System.out.println("表格已经存在");
            return;
        }

        Admin admin = connection.getAdmin();
        //工厂模式 创建描述
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
        for (String family : families) {
            //创建列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(family));
            //修改单个列族的参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }
        //调用方法创建表格
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            e.printStackTrace();
        }
        admin.close();

    }
    public static void main(String[] args) throws IOException {
        System.out.println(connection);
        createNamespace("bigdata");
        System.out.println(isTableExists("bigdata","stu"));
        createTable("bigdata","stu","info");
        System.out.println(isTableExists("bigdata","stu"));
        close();
    }
}

三、DML

package com.hpu;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;


import java.io.IOException;

/**
 * @author LS
 * @date 2022/1/4 11:33
 * @description
 */
public class hbase_DML {
    public static Connection connection = hbase_DDL.connection;

    //插入
    public static void putCell(String namespace,String tablename,String rowkey,String family,String column,String value) throws IOException {
        //得到表
        Table table = connection.getTable(TableName.valueOf(namespace, tablename));
        //调用方法写入数据
        Put put = new Put(Bytes.toBytes(rowkey));
        //给put添加数据
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(column),Bytes.toBytes(value));
        try {
            table.put(put);
        } catch (IOException e) {
            e.printStackTrace();
        }
        table.close();

    }
    //查询
    public static void getcells(String namespace,String tablename,String rowkey,String family,String column) throws IOException {
        Table table = connection.getTable(TableName.valueOf(namespace, tablename));
        //调用方法get数据
        Get get = new Get(Bytes.toBytes(rowkey));
        //设置get能够读取多个版本的数据
        get.readAllVersions();
        //添加信息可以读一列的数据
        get.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
        //如果不给get添加列的信息,可以直接读取一行的数据
        try {
            Result result = table.get(get);
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                System.out.println(new String(CellUtil.cloneValue(cell)));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        table.close();

    }
    //删除
    public static void deleteCells(String namespace,String tablename,String rowkey,String family,String column) throws IOException {
        Table table = connection.getTable(TableName.valueOf(namespace, tablename));

        Delete delete = new Delete(Bytes.toBytes(rowkey));
        //delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(column));
        delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(column));
        try {
            table.delete(delete);
        } catch (IOException e) {
            e.printStackTrace();
        }
        table.close();
    }
    //扫描
    public static void scanTable(String namespace,String tablename,String startRow,String stopRow) throws IOException {
        Table table = connection.getTable(TableName.valueOf(namespace, tablename));
        Scan scan = new Scan();
         填写开始的rowKey范围和结束的rowKey范围,默认使用左闭右开
        scan.withStartRow(Bytes.toBytes(startRow));
        scan.withStopRow(Bytes.toBytes(stopRow));
        // 开启raw原始数据模式,可以读取多个版本的数据,超过列族维护数据的限制
        scan.setRaw(true);
        scan.readVersions(5);
        try {
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();
                for (Cell cell : cells) {
                    System.out.print(new String(CellUtil.cloneRow(cell)) + "-"+new String(CellUtil.cloneFamily(cell))+"-" +new String(CellUtil.cloneQualifier(cell))+"-"+new String(CellUtil.cloneValue(cell))+"\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        table.close();
    }
    public static void main(String[] args) throws IOException {
        putCell("bigdata","stu","1001","info","age","18");
        getcells("bigdata","stu","1001","info","age");
        deleteCells("bigdata","stu","1001","info","age");
        getcells("bigdata","stu","1001","info","age");
        scanTable("default","stu","1001","1006");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值