HBASE Java API 有 1.x 和 2.x, 有一定差距, 本文基于 2.x 的 Java 操作, 对 hbase 表的基本的 增删查改操作.
注意点:
Put, Get, Delete 都都可以使用 addColumn 来对指定的 列 进行相关操作.
Scan 可以通过添加 filters 来进行条件过滤, 其中 Filter 是过滤条件, 拥有许多预定义的 Filter 类, 其都是 BaseFilter 的子类, 如 ColumnValueFilter, ColumnPrefixFilter 等等.
API 的基本规律为:
对表的操作,都需要获取 admin, 然后才可以进行相关操作, 其中删除表前需要先禁用表.
对表数据的操作, 都需要通过 connection 获取 Table 对象, 然后才使用 get, put, delete, scan 对象进行 crud 操作.
import com.sun.istack.Nullable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
import java.util.function.Consumer;
/**
* @author djh on 2020/1/7 11:36
* @E-Mail 1544579459@qq.com
*/
public class CrudDemo {
private static final String TABLE_NAME = "djhTable";
public static final String COLUMN_FAMILY_ATTRIBUTE = "attribute";
public static final String COLUMN_FAMILY_HOBBY = "hobby";
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop1-host:2181,hadoop2-host:2181,hadoop3-host:2181,hadoop4-host:2181,hadoop5-host:2181");
Connection connection = ConnectionFactory.createConnection(conf);
// 创建表.
//createTable(TABLE_NAME, connection);
// 插入数据
putData(TABLE_NAME, "row_1", COLUMN_FAMILY_ATTRIBUTE, "age", "22岁", connection);
putData(TABLE_NAME, "row_2", COLUMN_FAMILY_ATTRIBUTE, "age", "23岁", connection);
putData(TABLE_NAME, "row_3", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
putData(TABLE_NAME, "row_5", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
putData(TABLE_NAME, "row_7", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
putData(TABLE_NAME, "row_88", COLUMN_FAMILY_ATTRIBUTE, "age", "55岁", connection);
putData(TABLE_NAME, "row_99", COLUMN_FAMILY_ATTRIBUTE, "age", "66岁", connection);
// 获取数据
System.out.println("获取单行数据:");
getData(TABLE_NAME, "row_1", connection);
// 扫描表
System.out.println("扫描表:");
scannerTable(TABLE_NAME, connection);
ColumnValueFilter columnValueFilter =
new ColumnValueFilter(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes(), CompareOperator.GREATER_OR_EQUAL, "24岁".getBytes());
// 根据条件扫描
System.out.println("根据条件扫描表:");
FilterList filterList = new FilterList(columnValueFilter);
filterTable(TABLE_NAME, null, null, filterList, connection);
}
private static void createTable(String tableName, Connection connection) throws IOException {
Admin admin = connection.getAdmin();
// 1. 创建表描述
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
// 2. 创建列族描述
ColumnFamilyDescriptor columnFamilyOne = ColumnFamilyDescriptorBuilder.of(COLUMN_FAMILY_ATTRIBUTE);
// 3. 为表指定列族描述
tableDescriptorBuilder.setColumnFamily(columnFamilyOne);
// 4. 创建表
admin.createTable(tableDescriptorBuilder.build());
}
private static void deleteTable(String tableName, Connection connection) throws IOException {
Admin admin = connection.getAdmin();
// 删除表前需要先禁用.
admin.disableTable(TableName.valueOf(tableName));
admin.deleteTable(TableName.valueOf(tableName));
}
private static void putData(String tableName, String rowKey, String columnFamily, String column, String data, Connection connection) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
// 1. 指定行键
Put put = new Put(rowKey.getBytes());
// 2. 指定列和要插入的数据.
put.addColumn(columnFamily.getBytes(), column.getBytes(), data.getBytes());
// 3. 插入
table.put(put);
// 4. 释放资源
table.close();
}
private static void getData(String tableName, String rowKey, Connection connection) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
Result result = table.get(get);
if (result.containsColumn(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes())) {
byte[] value = result.value();
String s = new String(value);
System.out.println(s);
}
table.close();
}
private static void scannerTable(String tableName, Connection connection) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
scanner.iterator().forEachRemaining(result -> System.out.println(new String(result.value())));
}
/**
* 根据条件扫描 table 指定的行.
*/
private static void filterTable(String tableName, @Nullable String startRowKey, @Nullable String endRowKey, FilterList filterList, Connection connection) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
if (startRowKey != null && endRowKey != null) {
scan.withStartRow(startRowKey.getBytes());
scan.withStopRow(endRowKey.getBytes());
}
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
scanner.iterator().forEachRemaining(result -> System.out.println(new String(result.value())));
}
private static void deleteData(String tableName, String rowKey, Connection connection) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(rowKey.getBytes());
delete.addColumn(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes());
table.delete(delete);
table.close();
}
}
运行结果:
获取单行数据:
22岁
扫描表:
22岁
23岁
24岁
24岁
24岁
55岁
66岁
根据条件扫描表:
24岁
24岁
24岁
55岁
66岁
Process finished with exit code 0