JavaAPI操作HBase-Day2

Java代码操作HBase

pom依赖,依赖版本要和软件一致
xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-common</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-protocol</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase</artifactId>
        <version>2.5.5</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.glassfish</groupId>
                <artifactId>javax.el</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-mapreduce</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-zookeeper</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
    </dependency>
    <!--日志打印-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.12.0</version>
    </dependency>
    <!--Hadoop通用包-->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.2.4</version>
    </dependency>
    <!--Hadoop客户端-->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.2.4</version>
    </dependency>
    <!--Hadoop HDFS-->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>3.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-auth</artifactId>
        <version>3.2.4</version>
    </dependency>
</dependencies>
操作命名空间
java 复制代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


    private Connection connection;
    private Admin admin;

    // 连接HBase

	//Socket error occurred: localhost/127.0.0.1:2181: 拒绝连接. 不指定就访问本地2181Port
	//因为connection = ConnectionFactory.createConnection();没有conf参数

    @Before
    public void connect() throws IOException {

        // 获取配置
        Configuration conf = HBaseConfiguration.create();
        // 指定Zookeeper的地址
        // hadoop在 /etc/hosts文件做了ip映射
        conf.set("hbase.zookeeper.quorum", "hadoop:2181");
        // 获取连接
         connection = ConnectionFactory.createConnection(conf);
         // 获取管理权
         admin = connection.getAdmin();

    }

// 在Test执行之后执行.关闭连接
 @After
    public void close() throws IOException {
        if (admin != null) admin.close();
        if (connection != null) connection.close();
    }




// 创建名称空间
// create_namespace 'api'
@Test
public void createNamespace() throws IOException {
    // 构建空间描述器
    NamespaceDescriptor nd = NamespaceDescriptor.create("api").build();
    // 创建名称空间
    admin.createNamespace(nd);
}

// 列出所有的名称空间
// list_namespace
@Test
public void listNamespace() throws IOException {
    // 将名称空间的名字放到数组中返回
    String[] namespaces = admin.listNamespaces();
    for (String namespace : namespaces) {
        System.out.println(namespace);
    }
}

// 删除名称空间
// drop_namespace
@Test
public void dropNamespace() throws IOException {
    // 要求空间为空
    // 如果不为空,那么会抛出异常 - ConstraintException
    admin.deleteNamespace("api");
}
操作表
java 复制代码
private Connection connection;

private Admin admin;

private Table table;




@Test
public void createTable() throws Exception{

    ColumnFamilyDescriptor cl1 = ColumnFamilyDescriptorBuilder.newBuilder("basic".getBytes()).build();
    ColumnFamilyDescriptor cl2 = ColumnFamilyDescriptorBuilder.newBuilder("info".getBytes()).build();

    // Demo:user   在Demo命名空间内创建user表      user 在default空间内
    TableDescriptor  table1 = TableDescriptorBuilder.newBuilder(TableName.valueOf("user"))
            .setColumnFamily(cl1)
            .setColumnFamily(cl2)
            .build();
    admin.createTable(table1);
}

@Test
public void append() throws IOException {
    //RowKEY
    Append append = new Append("u1".getBytes());
    //ColumnFamily  Column   value
    byte[] basic = "basic".getBytes();
    append.addColumn(basic,"name".getBytes(),"hsk".getBytes());
    append.addColumn(basic,"age".getBytes(),"15".getBytes());
    byte[] info = "info".getBytes();
    append.addColumn(info,"phone".getBytes(),"nonono".getBytes());
    append.addColumn(info,"address".getBytes(),"beijing".getBytes());
    table.append(append);

}
//put一百万数据
//26s即可。效率很高 。  Rowkey有序但不是大小排序。而是字典排序(一个字符一个字符来排序  9 在 1221之后,因为9比1大)

@Test
public void putMillions() throws Exception{

    ArrayList<Put> list = new ArrayList<Put>();

    long start = System.currentTimeMillis();

    //CoulumnFamily
    byte[] basic = "basic".getBytes();
    //Column
    byte[] password = "passWoed".getBytes();

    for (int i = 0; i < 1000000; i++) {

        //RowKey
        byte[] rowKey = ("m" + i).getBytes();
        Put put = new Put(rowKey);
        put.addColumn(basic,password,reducePassword());
        list.add(put);
        if(i==10000){
            table.put(list);
            list.clear();
        }




    }
    long end = System.currentTimeMillis();
    System.out.println(end-start);
}

@Test
public void delete() throws Exception{
    //确定行
    Delete delete = new Delete("u1".getBytes());
    //ColumnFamily
    delete.addFamily("basic".getBytes());

    table.delete(delete);
}

@Test
public void deleteAll() throws Exception{
    Delete delete = new Delete("u1".getBytes());
    table.delete(delete);
}

//获取Cell
@Test
public void getCell() throws Exception{
    Get get = new Get("u1".getBytes());
    get.addColumn("basic".getBytes() ,"name".getBytes());
    Result result = table.get(get);
    byte[] value = result.getValue("basic".getBytes(), "name".getBytes());
    System.out.println(new String(value));
}

//getColumnFamily
@Test
public void getColumn() throws Exception{
    Get get = new Get("u1".getBytes());
    get.addFamily("basic".getBytes());
    Result result = table.get(get);
    NavigableMap<byte[], byte[]> familyMap = result.getFamilyMap("basic".getBytes());
    for (Map.Entry<byte[], byte[]> entry : familyMap.entrySet()) {
        System.out.println(new String(entry.getKey())+"  "+new String(entry.getValue()));
    }
}

//getLine
//结果map嵌套map
@Test
public void getLineByFor() throws IOException{
    Get get = new Get("u1".getBytes());
    Result result = table.get(get);
    NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
    for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> navigableMapEntry : map.entrySet()) {
        System.out.println("Column Family\t:"+new String(navigableMapEntry.getKey()));
        for (Map.Entry<byte[], NavigableMap<Long, byte[]>> mapEntry : navigableMapEntry.getValue().entrySet()) {
            System.out.println("Column Name\t:"+new String(mapEntry.getKey()));
            for (Map.Entry<Long, byte[]> longEntry : mapEntry.getValue().entrySet()) {
                System.out.println("\t\tTimeStamp\t:"+longEntry.getKey());
                System.out.println("\t\tCellValue\t:"+new String(longEntry.getValue()));
            }
        }

    }
}


//Lambda方式获取整行数据
@Test
public void getLineByLambda() throws IOException{
    Get get = new Get("u1".getBytes());
    Result result = table.get(get);
    NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> row = result.getMap();
    row.forEach((key,value) ->{
        System.out.println("Column Family\t:"+new String(key));
        value.forEach((keyy,valuee)->{
            System.out.println("\tColumn Name\t:"+new String(keyy));
            valuee.forEach((keyyy,valueee)->{
                System.out.println("\t\tTimstamp\t:"+keyyy+ "\t\tvalue\t:"+new String(valueee));
            });
        });
    });

}

//整表查询
@Test
public void scan() throws IOException{
    Scan scan = new Scan();
    ResultScanner results = table.getScanner(scan);
    Iterator<Result> iterator = results.iterator();
    while(iterator.hasNext() ){
        Result next = iterator.next();
        // 根据需求来确定获取指定列,还是获取指定列族或者是整表数据
        // 获取整表数据
        // r.getMap();
        // 获取指定列族的数据
        // r.getFamilyMap(ColumnFamily );
        // 获取指定列的数据
        // r.getvalue(ColumnFamily , ColumnName)

        //todo 获取不到每行的RowKey
        NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> row = next.getMap();
        row.forEach((key,value) ->{
            System.out.println("Column Family\t:"+new String(key));
            value.forEach((keyy,valuee)->{
                System.out.println("\tColumn Name\t:"+new String(keyy));
                valuee.forEach((keyyy,valueee)->{
                    System.out.println("\t\tTimstamp\t:"+keyyy+ "\t\tvalue\t:"+new String(valueee));
                });
            });
        });

        System.out.println("----------------------------------------------------------");
        NavigableMap<byte[], byte[]> familyMap = next.getFamilyMap("basic".getBytes());
        familyMap.forEach((k,v)->{
            System.out.println("ColumnName"+new String(k)+"\t--"+new String(v));
        });

        System.out.println("----------------------------------------------------------");
        byte[] value = next.getValue("basic".getBytes(), "password".getBytes());
        System.out.println(value == null ? "null":new String(value));
    }
}

// 基于Scan操作的前提下,还可以对结果来进行过滤
@Test
public void filter() throws IOException {
    Scan scan = new Scan();
    // 构建Filter对象
    // 过滤密码中含有AAA的数据
    // .*AAA.*
    // CompareOperator - 比较方式
    // ByteArrayComparable - 比较规则
    Filter f = new ValueFilter(CompareOperator.EQUAL, new RegexStringComparator(".*A.*"));
    scan.setFilter(f);
    // 获取结果集
    ResultScanner rs = table.getScanner(scan);
    for (Result r : rs) {
        byte[] value = r.getValue("basic".getBytes(), "passWoed".getBytes());
        System.out.println(value == null ? "null" : new String(value));
    }

}



public byte[] reducePassword(){
    StringBuilder stringBuilder = new StringBuilder();

    for (int i = 0; i < 6; i++) {
        stringBuilder.append((char)(Math.random()*26+65));
    }

    return  stringBuilder.toString().getBytes();
}
相关推荐
longlongqin2 分钟前
redis的 stream数据类型实现 消息队列?
数据库·redis·缓存
一只积极向上的小咸鱼5 分钟前
git常用命令总结
大数据·git·elasticsearch
hankl199010 分钟前
spark里使用geohash处理数据之线程安全问题
大数据·分布式·spark
wrx繁星点点15 分钟前
多个线程同时写入一个共享变量,会发生什么问题?如何解决?
java·开发语言·数据库
鲨鱼辣椒ii31 分钟前
sql中索引查看是否生效
数据库·sql
檀越剑指大厂1 小时前
【Elasticsearch系列】Elasticsearch中的分页
大数据·elasticsearch·搜索引擎
leidata1 小时前
MySQL系列—10.Innodb行格式
数据库·mysql
LNTON羚通2 小时前
明烟明火检测算法、烟火检测、森林防火检测
大数据·网络·人工智能·算法·音视频
阿维的博客日记2 小时前
聚簇索引和二级索引
数据库·聚簇索引·二级索引
璇嘟嘟2 小时前
springboot-创建连接池
数据库