hbase java代码API

简介:
本篇博客是hbase api java代码的相关代码,主要包括ddl部分的命名空间创建,表的创建,表的修改,表的删除,dml部分包含数据的插入,数据的修改,数据的查询,数据的删除操作。

创建maven工程

1、对pom.xml进行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>hbaseDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <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>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>

    </dependencies>

</project>

2、在画框的目录下添加画框的文件
在这里插入图片描述
然后输入以下内容:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

Hbase ddl API代码

package com.lqs.hbase.ddl;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
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 qingSong liu
 * @version 1.0
 * @time 2021/12/29 23:25
 * 官方创建链接
 */

public class OfficialCreateHBaseConnectDemo {


    public static void main(String[] args) {
        System.out.println(connection);
    }

    //声明静态属性
    public static Connection connection;

    //初始化单列链接
    static {
        try {
            //获取配置类
            Configuration configuration = HBaseConfiguration.create();

            //给配置类添加配置
            configuration.set("hbase.zookeeper.quorum", "bdc112,bdc113,bdc114");

            //创建链接
            connection = ConnectionFactory.createConnection(configuration);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void close() {
        try {
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建命名空间
     *
     * @param nameSpace 传入要创建的空间名称
     * @return boolean
     */
    public static boolean createNameSpace(String nameSpace) {
        //获取admin
        //返回数据标志
        boolean flag = false;
        try {

            Admin admin = connection.getAdmin();

            //创建descriptor(描述符)
            NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();

            //创建命名空间
            admin.createNamespace(namespaceDescriptor);
            //创建成功
            flag = true;
            admin.close();
        } catch (NamespaceExistException e) {
            //捕获名称存在错误
            System.out.println("命名空间已经存在!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return flag;
    }

    /**
     * 判断表是否存在
     *
     * @param nameSpace 空间名称
     * @param tableName 表名称
     * @return boolean true代表存在,false代表不存在
     */
    public static boolean isTableExist(String nameSpace, String tableName) {
        boolean b = false;
        try {
            //获取admin
            Admin admin = connection.getAdmin();

            //判断表是否存在
            b = admin.tableExists(TableName.valueOf(nameSpace, tableName));

            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return b;
    }

    /**
     * 创建表
     *
     * @param nameSpace   空间名
     * @param tableName   表名称
     * @param familyNames 列族名
     * @return true表示创建成功,false表示创建失败
     */
    public static boolean createTable(String nameSpace, String tableName, String... familyNames) {

        //判断是否存在列族信息
        if (familyNames.length <= 0) {
            System.out.println("列族信息不存在,请设置列族信息...");
            return false;
        }

        //判断表格是否存在
        if (isTableExist(nameSpace, tableName)) {
            System.out.println("该表格已经存在");
            return false;
        }


        try {
            //获取admin
            Admin admin = connection.getAdmin();
            //获取descriptor的builder
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(nameSpace, tableName));
            //添加列族
            for (String familyName : familyNames) {
                //获取单个列族descriptor
                ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(familyName));

                //添加版本
                columnFamilyDescriptorBuilder.setMaxVersions(2);

                //将单个列族的descriptor添加到builder中
                tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
            }
            //创建表
            admin.createTable(tableDescriptorBuilder.build());
            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

    /**
     * 修改表格,定向修改内容
     *
     * @param nameSpace  空间名称
     * @param tableName  表名称
     * @param familyName 列族名称
     * @param version    版本号
     * @return true表示修改成功,false表示修改失败
     */
    public static boolean modifyTable(String nameSpace, String tableName, String familyName, int version) {
        try {
            //获取admin
            Admin admin = connection.getAdmin();
            /*//修改表格
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(nameSpace, tableName));

            //修改列族信息
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(familyName));
            columnFamilyDescriptorBuilder.setMaxVersions(version);

            //添加修改的信息
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
            admin.modifyTable(tableDescriptorBuilder.build());*/

            //获取原来的描述
            TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(nameSpace, tableName));

            //获取原来描述的builder
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);

            //在原先的builder中修改对应的列族
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(familyName)).setMaxVersions(version);

            //传递列族描述
            tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());

            //传递表格描述
            admin.modifyTable(tableDescriptorBuilder.build());

            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

    /**
     * 删除表
     *
     * @param nameSpace 要删除的空间名称
     * @param tableName 要删除的表名称
     * @return true表示删除成功,false表示删除失败
     */
    public static boolean deleteTable(String nameSpace, String tableName) {
        //判断表格是否存在
        if (!isTableExist(nameSpace, tableName)) {
            System.out.println("删除失败!表格不存在...");
            return false;
        }

        try {
            //获取admin
            Admin admin = connection.getAdmin();
            //标记表格为disable(禁用表)
            admin.disableTable(TableName.valueOf(nameSpace, tableName));
            //删除表格
            admin.deleteTable(TableName.valueOf(nameSpace, tableName));

            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

}

Hbase dml API代码

package com.lqs.hbase.dml;

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

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author qingSong liu
 * @version 1.0
 * @time 2021/12/30 09:31
 */

public class HBaseDMLUtil {

    private static Connection connection;

    //获取连接
    static {
        try {
            //获取配置类
            Configuration configuration = HBaseConfiguration.create();

            //给配置类添加参数
            configuration.set("hbase.zookeeper.quorum", "bdc112,bdc113,bdc114");

            //创建连接
            connection = ConnectionFactory.createConnection(configuration);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * HBase_DML的插入数据操作
     *
     * @param nameSpace 要插入数据的命名空间
     * @param tableName 要插入数据的表名称
     * @param rowKey    要插入数据的行key
     * @param family    要插数据的族信息
     * @param column    要插入数据的列信息
     * @param value     要插入数据的值
     */
    public static void putCell(String nameSpace, String tableName, String rowKey, String family, String column, String value) {

        try {
            //获取table
            Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));
            //创建put对象
            Put put = new Put(Bytes.toBytes(rowKey));

            //添加put属性
            put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));
            //插入(put)数据
            table.put(put);

            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 查询Hbase数据操作
     *
     * @param nameSpace 要查询数据的名称空间
     * @param tableName 要查询数据的表名称
     * @param rowKey    要查询数据的行key
     * @param family    要查询数据的族信息
     * @param column    要查询数据的列信息
     * @return 返回的是String类型的查询到的数据结果
     */
    public static String getCell(String nameSpace, String tableName, String rowKey, String family, String column) {

        String value = "";
        //获取table
        try {
            //获取table
            Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));

            //获取get对象
            Get get = new Get(Bytes.toBytes(rowKey));
            //添加get属性
            get.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));

            //获取(get)数据
            //简单获取
//            byte[] value = table.get(get).value();
//            String s = new String(value);
            //复杂获取
            //获取结果(result
            Result result = table.get(get);
            //h获取cells
            Cell[] cells = result.rawCells();
            //遍历cells结果集
            for (Cell cell : cells) {
                //输出每个cell
                value += Bytes.toString(CellUtil.cloneValue(cell)) + "-";
            }
            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return value;

    }

    /**
     * 扫描数据操作
     *
     * @param nameSpace 要扫描数据的空间名称
     * @param tableName 要扫描数据的表名称
     * @param startRow  要扫描数据的行开始的位置
     * @param stopRow   要扫描数据的行结束的位置
     * @return 返回的是扫描到的数据的结果,它的类型是List<String>类型的
     */
    public static List<String> scanRows(String nameSpace, String tableName, String startRow, String stopRow) {

        ArrayList<String> arrayList = new ArrayList<>();
        try {
            //获取table
            Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));

            //创建扫描对象
            Scan scan = new Scan().withStartRow(Bytes.toBytes(startRow)).withStopRow(Bytes.toBytes(stopRow));
            //扫描数据
            ResultScanner scanner = table.getScanner(scan);
            //获取扫描得到的结果
            for (Result result : scanner) {
                arrayList.add(Bytes.toString(result.value()));
            }

            scanner.close();
            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return arrayList;

    }

    /**
     * 删除数据操作
     *
     * @param nameSpace 要删除数据的空间名称
     * @param tableName 要删除数据的表名称
     * @param rowKey    要删除数据的行key
     * @param family    要删除数据的族信息
     * @param column    要删除数据的列信息
     */
    public static void deleteColumn(String nameSpace, String tableName, String rowKey, String family, String column) {

        try {
            Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));

            //创建delete对象
            Delete delete = new Delete(Bytes.toBytes(rowKey));

            //添加删除信息
            //删除单个版本
//            delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(column));
            //删除所有版本
            delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
            //删除列族
//            delete.addFamily(Bytes.toBytes(family));
            //删除数据
            table.delete(delete);
            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


版权声明:本文为qq_43224174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。