HBase操作实践之JAVA API

举报
tea_year 发表于 2024/06/28 22:17:50 2024/06/28
【摘要】 环境准备依赖<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>2.4.11</version> <exclusions> <exclusion> <groupId>org.glassfish<...

环境准备

  • 依赖
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-server</artifactId>
    <version>2.4.11</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b06</version>
</dependency>
  • windows配置ip映射

API
含义
创建
Configuration
配置文件
HBaseConfiguration.create();
Connection
连接,用来操作数据
ConnectionFactory.createConnection(conf);
Admin

客户端,用来操作元数据 (namespace和table结构)
conn.getAdmin();
NamespaceDescriptor
命名空间相当于database
NamespaceDescriptor.create("testns").build();
TableName
表名
TableName.valueOf("testns:user");
HTableDescriptor
new HTableDescriptor(tablename);
HColumnDescriptor
列族
new HColumnDescriptor("info");
Put
添加数据
new Put(Bytes.toBytes("10001"));
Delete
rowkey的删除条件
new Delete(Bytes.toBytes("10001"));
Get
scan多行查询器
new Get(Bytes.toBytes("10019"));
Scan
scan多行查询器
new Scan();
Result
查询结果集(单条结果)
table.get(get);
ResultScanner
查询结果集(N条结果)
table.getScanner(scan);
Bytes
类型转化工具类,HBase中数据类型为字节, 所有类型存入后都变成字节,需要相互转化。

HBase客户端连接

注意:配置windows向linux的ip映射。
// 获得客户端
//1. 读取配置文件
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","hadoop10");
BasicConfigurator.configure();//打印日志信息
//2. 建立连接
Connection conn = ConnectionFactory.createConnection(conf);
//3. 获得客户端
admin = conn.getAdmin();
// 释放资源
admin.close();

常用API

1. 创建namespace

//1. 构建namespace信息。  create_namespace 'testns'
NamespaceDescriptor testns = NamespaceDescriptor.create("testns").build();
//2. 创建namespace
admin.createNamespace(testns);

2. 表操作

操作表,使用admin
  • 判断表是否存在
//1. 创建表名
TableName tableName = TableName.valueOf("testns:person");
//2. 判断表是否存在
boolean b = admin.tableExists(tableName);
System.out.println(b?"存在":"不存在");
  • 创建表
//1. 初始化表名   create 'testns:person','info','addr'
TableName person = TableName.valueOf("testns:person");
//2. 初始化列族信息
HColumnDescriptor info = new HColumnDescriptor("info");
HColumnDescriptor addr = new HColumnDescriptor("addr");
//3. 绑定表名,绑定列族
HTableDescriptor hTableDescriptor = new HTableDescriptor(person);
hTableDescriptor.addFamily(info);
hTableDescriptor.addFamily(addr);
//4. 创建表
admin.createTable(hTableDescriptor);

3. 添加

操作数据使用conn

//1. 初始化要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 创建 添加数据
Put put = new Put(Bytes.toBytes("1001"));//构造rowkey
// Bytes是HBase提供的进行字节和java数据类型转化的工具类
put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes("张三") );
put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"), Bytes.toBytes(18));
put.addColumn(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"), Bytes.toBytes("45000"));
//3. 将put数据添加。
table.put(put);
//4. 释放资源
table.close();

4.修改

//1. 初始化要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 修改的本质就是添加,利用时间戳覆盖旧的数据而已。
Put put = new Put(Bytes.toBytes("1001"));
put.addColumn(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"), Bytes.toBytes("45001"));
//3. 添加到表中
table.put(put);
//4. 关闭table
table.close();

5.删除

//1. 获得要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 创建要删除的条件,以rowkey为条件
Delete delete = new Delete(Bytes.toBytes("1001"));

//删除某个列族
//delete.addFamily(Bytes.toBytes("cf2"));
//删除某个列
//delete.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("age"));

//3. 执行删除
table.delete(delete);

6.查询

//根据rowkey查询
//1. 获得要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 使用rowkey作为查询条件
Get get = new Get(Bytes.toBytes("10019"));
//3. 执行查询
Result result = table.get(get);
//4. 处理结果集:result.getValue;
byte[] namebyte = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
//下面代码雷同。
byte[] agebyte = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"));
byte[] zipbyte = result.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"));
//获得rowkey
byte[] rowbytes = result.getRow();
System.out.println(Bytes.toString(namebyte));
System.out.println(Bytes.toInt(agebyte));
System.out.println(Bytes.toString(zipbyte));

//多条查询
//1. 获得要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 创建scan扫描器,多行查询
Scan scan = new Scan();
//3. 指定要投射的列族。
scan.addFamily(Bytes.toBytes("info"));
scan.addFamily(Bytes.toBytes("addr"));
//4. 设置起始和查询条数
scan.setStartRow(Bytes.toBytes("1001"));
scan.setFilter(new PageFilter(3));
//5. 执行查询
ResultScanner result = table.getScanner(scan);
//6. 处理结果集
for (Result res:result){
    byte[] namebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
    byte[] agebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"));
    byte[] zipCodebyte = res.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"));
    String name = Bytes.toString(namebyte);
    int age = Bytes.toInt(agebyte);
    String zipcode = Bytes.toString(zipCodebyte);
    System.out.println(name+":"+age+":"+zipcode);
}
//7. 关闭table
table.close();


//范围查询
//1. 获得要操作的表
Table table = conn.getTable(TableName.valueOf("testns:person"));
//2. 创建scan扫描器,多行查询
Scan scan = new Scan();
//3. 指定要投射的列族。
scan.addFamily(Bytes.toBytes("info"));
scan.addFamily(Bytes.toBytes("addr"));
//4. 设置起始和查询条数
scan.setStartRow(Bytes.toBytes("1001"));
scan.setStopRow(Bytes.toBytes("1003"));
//5. 执行查询
ResultScanner result = table.getScanner(scan);
//6. 处理结果集
for (Result res:result){
    byte[] namebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
    byte[] agebyte = res.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"));
    byte[] zipCodebyte = res.getValue(Bytes.toBytes("addr"), Bytes.toBytes("zipCode"));
    String name = Bytes.toString(namebyte);
    int age = Bytes.toInt(agebyte);
    String zipcode = Bytes.toString(zipCodebyte);
    System.out.println(name+":"+age+":"+zipcode);
}
//7. 关闭table
table.close();
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。