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();
configuration.set("zookeeper.znode.parent","/hbase-unsecure");
configuration.set("hbase.zookeeper.quorum","192.168.3.100");
configuration.set("hbase.zookeeper.property.clientPort","2181");
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);
admin.deleteColumn(tableName,columnFamily.getBytes());
2.4 TableName
TableName 是一个表名对象。一般用TableName.valueOf(“tableNameString”);得到
// TableName.valueOf()获得一个表名对象
TableName tableName=TableName.valueOf(tableNameString);
// 这个对象主要是作为一些方法的参数使用。
2.5 Table
Table 是一个数据表对象
Table table = connection.getTable(TableName.valueOf(tableNameString));
ResultScanner scanner = table.getScanner(new Scan());
table.delete(new Delete(Bytes.toBytes(rowKey));
table.put();
Result result = table.get(get);
2.6 HColumnDescriptor
HColumnDescriptor对象代表一个 数据簇(列族)描述对象,一般通过new来创建:
HColumnDescriptor family = new HColumnDescriptor("columnName");
2.7 HTableDescriptor
HTableDescriptor对象代表了一个数据表描述对象,一般通过new 来创建:
HTableDescriptor hTableDescriptor = new HTableDescriptor(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();
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);
byte[] row = result.getRow();
System.out.println("row key is:"+new String(row));
List<Cell> listCells = result.listCells();
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);
2.12 Put
Put 用在插入时,用来保存插入值得一个对象。
TableName tablename = TableName.valueOf(tableName);
Put put = new Put(("rowkey").getBytes());
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);
List<Put> putList = new ArrayList<put>();
Put put;
for(int i = 0; i < 10; i++){
put = new Put(Bytes.toBytes("row" + i));
put.addColumn(Bytes.toBytes("Base")
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 {
Configuration configuration = HBaseConfiguration.create();
configuration.set("zookeeper.znode.parent","/hbase-unsecure");
configuration.set("hbase.zookeeper.quorum","192.168.8.30");
configuration.set("hbase.zookeeper.property.clientPort","2181");
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,经过自测,功能均正常。
|