Hbase的学习笔记(3)

Hbase的学习笔记(3)

本次主要学习Hbase与Java的配合使用,即通过Java语言完成对Hbase表的增删改查。

1. 所需依赖jar包

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
</dependency>

注意:有些时候程序报错,跟maven的jar包加载顺序有关,具体的可以去了解下相关知识。我在测试时,虽然有的类导包进来是 import org.apache.hadoop.hbase.*;但它所在的jar包不一定是org.apache.hadoop:hadoop-client。比如我除了上述jar包外,还导入了phoenix 提供的相关jar,所以有时候看到 import 导进来编译不报错,实际上点开它所在的jar包可能会是:org.apache.phoenix:phoenix-client。需要注意的是,maven的jar包加载顺序是从上到下的,有点类似于JVM类加载的双亲委派机制,但是,具体的可能也会跟机器有关。如果你用到的类a.java可能存在于多个jar包,如。A.jar,B.jar,但你想要使用的是B.jar下面的a.java,所以你需要把B.jar手动拖到A.jar的上面,这样maven 从上到下先加载到B.jar,就可以正确导入你想要的a.java了。

<!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-client -->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-client</artifactId>
    <version>4.14.1-HBase-1.4</version>
    <scope>test</scope>
</dependency>

2. 认识一些类及作用

我们在使用Java对HBase进行增删改查的练习时,需要用到的类,基本都是在我们添加进来的jar中的,所以导入时一定要选好是那个jar包下的类。(下面的类是本人在学习代码的过程中遇到的,如有描述不准的地方,请指正)

2.1 Configuration

通过 Configuration 可以得到一个数据库配置参数的对象,该对象由 HBaseConfiguration.create();得到,然后就可以往该对象里面set一些配置参数了。

// 得到一个数据库配置参数的对象
Configuration configuration = HBaseConfiguration.create();    
// 设置配置参数 set()有两个参数,可以理解为键值对的形式,前面的都是固定的,后面的参数需要根据自己的实际情况写
// hbase的默认端口为2181
configuration.set("zookeeper.znode.parent","/hbase-unsecure"); // 与 hbase-site-xml里面的配置信息 zookeeper.znode.parent 一致  
configuration.set("hbase.zookeeper.quorum","192.168.3.100");  // hbase 数据库所在的主机
configuration.set("hbase.zookeeper.property.clientPort","2181"); // hbase 数据库试用的端口号

2.2 Connection

通过 Connection 创建数据库参数配置的对象,该对象由ConnectionFaction.createConnection(configuration);得到,并提供了一些方法。

// 创建数据库连接对象
Connection connection = ConnectionFactory.createConnection(configuration);
// 获取元数据操作对象
Admin admin = connection.getAdmin();
// 获取数据表对象
Table table = connection.getTable(TableName.valueOf(tableNameString));

2.3 Admin

admin 是用来对数据进行操作的对象,由connection.getadmin();得到,并提供了一些方法

// 获取元数据操作对象
Admin admin = connection.getadmin();
// 获取到数据库所有表信息
HTableDescriptor[] allTable = admin.listTables();
// 创建表,参数为表描述对象
admin.createTable(hTableDescriptor); // 参数为数据表描述对象
// 判断表是否存在
TableName tableName = TableName.valueOf(tableNameString);// 创建表明对象
boolean b = admin.tableExists(tableName);
// 获取 数据库所有表信息
HTableDescriptor[] lists = admin.listTables();// 返回表描述对象集合
// 设置表的状态为无效
admin.disableTable(TableName.valueOf(tableNameString));
// 设置表的状态为有效
admin.enableTable(TableName.valueOf(tableNameString));
// 清空指定表的数据
admin.truncateTable(tableName,true);
// 删除指定表
admin.deleteTable(TableName.valueOf(tableNameString));
// 添加列族 两个参数,第一个为表名对象,第二个为列描述对象
admin.addColumn(tableName,HcolumnDesciptor);
// 删除列族,第一个参数为表名对象。第二个为列名(str)的字节类型
admin.deleteColumn(tableName,columnFamily.getBytes());

2.4 TableName

TableName 是一个表名对象。一般用TableName.valueOf(“tableNameString”);得到

// TableName.valueOf()获得一个表名对象
TableName tableName=TableName.valueOf(tableNameString);
// 这个对象主要是作为一些方法的参数使用。

2.5 Table

Table 是一个数据表对象

// connection.getTable()获得数据表对象
Table table = connection.getTable(TableName.valueOf(tableNameString));
// 获取表中的数据 
ResultScanner scanner = table.getScanner(new Scan());
// 然后可以遍历scanner拿到一个Result对象得到数据,scan是一个扫描器对象,可以添加一些条件进行条件查询
// 删除表中rowkey与 与之对应的数据
table.delete(new Delete(Bytes.toBytes(rowKey));
// 添加数据
table.put(); // 参数可以是put,也可以是List<Put>
// 按行查询数据
Result result = table.get(get);// 参数为get对象,返回为result对象

2.6 HColumnDescriptor

HColumnDescriptor对象代表一个 数据簇(列族)描述对象,一般通过new来创建:

// 数据簇(列族)描述对象
HColumnDescriptor family = new HColumnDescriptor("columnName");// 参数为string类型的自定义列名

2.7 HTableDescriptor

HTableDescriptor对象代表了一个数据表描述对象,一般通过new 来创建:

// 数据表描述对象
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);// 参数为tableName对象
// 在数据表中添加列族,
hTableDescriptor.addFamily(family);// 参数为数据簇描述对象
hTableDescriptor.addFamily(family1);// 一个表描述对象。可以添加多个列族,一个一个的加 
// 获取表的名字
hTableDescriptor.getNameAsString();

2.8 ResultScanner

ResultScanner 是表中所有数据的对象,遍历它每次会拿到一个result对象

// 获取表中的数据
ResultScanner scanner = table.getScanner(new Scan);

2.9 Result

result对象一般是遍历ResultScanner产生的,代表单行数据

//循环输出表中的数据
for (Result result : scanner) {
      byte[] row = result.getRow();//获得 row key 
      System.out.println("row key is:"+new String(row));
      List<Cell> listCells = result.listCells(); // 获得单元数据,返回单元数据集合
      for (Cell cell : listCells) {
          byte[] familyArray = cell.getFamilyArray(); // 列族数组
          byte[] qualifierArray = cell.getQualifierArray(); // 限定符数组
          byte[] valueArray = cell.getValueArray(); // 值数组
          System.out.println("row value is:"+ new String(familyArray) +
                    new String(qualifierArray) + new String(valueArray));
       }
}
// 按行查询数据
Result result = table.get(get);// 参数为get对象,返回为result对象
// 获得row key
byte[] row = result.getRow();//获得 row key 
System.out.println("row key is:"+new String(row));
// 获得单元数据方式1,返回单元数据集合
List<Cell> listCells = result.listCells(); 
// 获得单元数据方式2,返回单元数据对象的数组
Cell[] cells = result.rawCells();

2.10 Scan

Scan理解为条件查询时的条件扫描器对象,可以添加一些过滤器作为条件。

// 创建查询器
Filter filter = new SingleColumnValueFilter(Bytes.toBytes("rowKeyname"), 
        Bytes.toBytes("columnFamilyName"), CompareOp.EQUAL, Bytes.toBytes("Column"));
// 创建扫描器
Scan scan = new Scan();
// 将查询过滤器的加入到数据表扫描器对象
scan.setFilter(filter);
// 执行查询操作,并获取查询结果
ResultScanner scanner =table.getScanner(scan);

2.11 Get

Get 理解为查询时,作为查询条件(如按行键查询)的查询对象

Get get = new Get("rowNameString".getBytes);
// 按行查询数据
Result result = table.get(get);// 参数为get对象,返回为result对象

2.12 Put

Put 用在插入时,用来保存插入值得一个对象。

// 1.直接put作为参数
TableName tablename = TableName.valueOf(tableName);
Put put = new Put(("rowkey").getBytes());// 通过rowkey创建put
//参数:1.列族名  2.列名  3.值
put.addColumn("columnFamily1".getBytes(), "column1".getBytes(), "value1".getBytes());
put.addColumn("columnFamily1".getBytes(), "column2".getBytes(), "value2".getBytes());
put.addColumn("columnFamily1".getBytes(), "column3".getBytes(), "value3".getBytes());
put.addColumn("columnFamily2".getBytes(), "column1".getBytes(), "value4".getBytes());
put.addColumn("columnFamily2".getBytes(), "column2".getBytes(), "value5".getBytes());
Table table = initHbase().getTable(tablename);
table.put(put);
// 2.List<Put>作为参数
List<Put> putList = new ArrayList<put>();
Put put;
for(int i = 0; i < 10; i++){
   put = new Put(Bytes.toBytes("row" + i));// 通过rowkey创建put
   put.addColumn(Bytes.toBytes("Base")//列簇,Bytes.toBytes("name")//列名,Bytes.toBytes("bookName")//值);
   putList.ad(put);
}
table.put(putList);

2.13 Delete

Delete 是一个删除条件的对象

// 创建删除条件对象
Delete delete = new Delete(Bytes.toBytes("rowkeyString");
// 执行删除操作(表中删除数据)
table.delete(delete);

3. 具体操作,代码等

由于本人也是在自学这块的知识,所以增删改查相关的代码都是借用CSDN其他博主的,这里在借鉴下他们的代码,同时原文连接也会放在代码后面,有需要的可以看看。

测试demo1

这个demo包含了连接hbase,和查询表信息的操作。

 public static void main(String[] args) throws IOException {
        //第一步,设置HBsae配置信息
        Configuration configuration = HBaseConfiguration.create();    
        //注意。这里这行目前没有注释掉的,这行和问题3有关系  是要根据自己zookeeper.znode.parent的配置信息进行修改。
       configuration.set("zookeeper.znode.parent","/hbase-unsecure"); //与 hbase-site-xml里面的配置信息 zookeeper.znode.parent 一致  
        configuration.set("hbase.zookeeper.quorum","192.168.8.30");  //hbase 服务地址
        configuration.set("hbase.zookeeper.property.clientPort","2181"); //端口号
        //这里使用的是接口Admin   该接口有一个实现类HBaseAdmin   也可以直接使用这个实现类
        Admin admin = ConnectionFactory.createConnection(configuration).getAdmin();
        if(admin !=null){
            try {
                //获取到数据库所有表信息
                HTableDescriptor[] allTable = admin.listTables();
                for (HTableDescriptor hTableDescriptor : allTable) {
                    System.out.println(hTableDescriptor.getNameAsString());
                }
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

原文博客:https://blog.csdn.net/ycf921244819/article/details/81706119

测试demo2

由于代码过长,在此只给出原文博客链接,这份代码包含了增删改查的所有基本操作。

原文博客:https://blog.csdn.net/qq_38256924/article/details/79848232

测试demo3

由于代码过长,在此只给出原文博客链接,这份代码包含了增删改查的所有基本操作,与测试demo2不同的是作者自己封装了一个User类进行参数的传递,重写了toString(),在控制台打印输出,看结果也比较直观方便。

原文博客:https://blog.csdn.net/m0_38075425/article/details/81287836

上述三份demo,经过自测,功能均正常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白居不易.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值