创建类 HBaseDML
public class HBaseDML {
// 添加静态属性 connection 指向单例连接
public static Connection connection = HBaseConnect.connection;
}
插入数据
/**
* 插入数据
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param rowKey 主键
* @param ColumnFamily 列族名称
* @param columnName 列名
* @param value 值
*/
public static void putCell(String namespace, String tableName, String rowKey, String ColumnFamily, String columnName, String value) throws IOException {
// 1.获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
// 2.调用相关方法插入数据
// 2.1 创建put对象
Put put = new Put(Bytes.toBytes(rowKey));
// 2.2 给put对象添加数据
put.addColumn(Bytes.toBytes(ColumnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));
// 2.3
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
// 3.关闭table
table.close();
}
读取数据
/**
* 读取数据,读取对应一行中的某一列
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param rowKey 主键
* @param ColumnFamily 列族名称
* @param columnName 列名
*/
public static void getCells(String namespace, String tableName, String rowKey, String ColumnFamily, String columnName) throws IOException {
//1. 获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//2. 创建get对象
Get get = new Get(Bytes.toBytes(rowKey));
// 如果直接调用get方法读取数据,此时读一整行数据
// 如果想读取某一列的数据,需要添加对应的参数
get.addColumn(Bytes.toBytes(ColumnFamily), Bytes.toBytes(columnName));
// 设置读取数据的版本
get.readAllVersions();
try {
// 读取数据,得到result对象
Result result = table.get(get);
//处理数据
Cell[] cells = result.rawCells();
//测试方法:直接把读取的数据打印到控制台
//如果是实际开发, 需要再写额外的方法,对应处理数据
for (Cell cell : cells) {
//Cell存储数据比较底层
String value = new String(CellUtil.cloneValue(cell));
System.out.println(value);
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭table资源
table.close();
}
扫描数据
/**
* 扫描数据
*
* @param namespace 命名空间
* @param tableName 表格名称
* @param startRow 开始的 row 包含的
* @param stopRow 结束的 row 不包含
*/
public static void scanRows(String namespace, String tableName, String startRow, String stopRow) throws IOException {
//1. 获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//2.创建Scan对象
Scan scan = new Scan();
//如果此时直接调用,会扫描整个表
//添加参数, 来控制扫描的数据
//默认包含
scan.withStartRow(Bytes.toBytes(startRow));
//默认不包含
scan.withStopRow(Bytes.toBytes(stopRow));
//读取多行数据,获得scanner
try {
ResultScanner scanner = null;
scanner = table.getScanner(scan);
//result来记录一行数据, cell数组
//ResultScanner 来记录多行数据 result的数组
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
System.out.println(new String(CellUtil.cloneRow(cell)) + "-" + new String(CellUtil.cloneFamily(cell)) + "-" + new String(CellUtil.cloneQualifier(cell))
+ "-" + new String(CellUtil.cloneValue(cell)) + "\t");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
table.close();
}
过滤扫描数据
/**
* 带过滤的扫描数据
*
* @param namespace 命名空间
* @param tableName 表格名称
* @param startRow 开始的 row 包含的
* @param stopRow 结束的 row 不包含
* @param columnFamily 列族名称
* @param columnName 列名称
* @param value value值
*/
public static void filterRows(String namespace, String tableName, String startRow, String stopRow, String columnFamily, String columnName, String value) throws IOException {
//1. 获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//2.创建Scan对象
Scan scan = new Scan();
//如果此时直接调用,会扫描整个表
//添加参数, 来控制扫描的数据
//默认包含
scan.withStartRow(Bytes.toBytes(startRow));
//默认不包含
scan.withStopRow(Bytes.toBytes(stopRow));
//可以添加多个过滤
FilterList filterList = new FilterList();
//创建过滤器
//(1) 结果只保留当前列的数据
ColumnValueFilter columnValueFilter = new ColumnValueFilter(
//列族名称
Bytes.toBytes(columnFamily),
//列名
Bytes.toBytes(columnName),
//比较关系
CompareOperator.EQUAL,
//值
Bytes.toBytes(value)
);
//(2) 结果保留整行数据
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
//列族名称
Bytes.toBytes(columnFamily),
//列名
Bytes.toBytes(columnName),
//比较关系
CompareOperator.EQUAL,
//值
Bytes.toBytes(value)
);
// filterList.addFilter(columnValueFilter);
filterList.addFilter(singleColumnValueFilter);
//添加过滤
scan.setFilter(filterList);
//读取多行数据,获得scanner
try {
ResultScanner scanner = null;
scanner = table.getScanner(scan);
//result来记录一行数据, cell数组
//ResultScanner 来记录多行数据 result的数组
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
System.out.println(new String(CellUtil.cloneRow(cell)) + "-" + new String(CellUtil.cloneFamily(cell)) + "-" + new String(CellUtil.cloneQualifier(cell))
+ "-" + new String(CellUtil.cloneValue(cell)) + "\t");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
table.close();
}
删除数据
/**
* 删除一行中的一列数据
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param rowKey 主键
* @param columnFamily 列族
* @param columnName 列名
*/
public static void deleteColumn(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {
//1. 获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//2. 创建delete对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
// 添加列信息
// addColumn删除一个版本
delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));
// addColumns删除所有的版本
//按照逻辑需要删除所有版本的数据
//delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));
try {
table.delete(delete);
}catch (IOException e){
e.printStackTrace();
}
//关闭table
table.close();
}
DML主程序
public class TheProgramDML {
public static void main(String[] args) throws IOException {
//添加数据
// putCell("bigdata","huanhuan","1001","info","name","欢欢");
// putCell("bigdata","huanhuan","2001","info","name","欢欢");
// putCell("bigdata","huanhuan","1001","info","name","呆哥");
// putCell("bigdata","huanhuan","1001","info","name","昊哥");
//
//
// //读取数据
// getCells("bigdata","huanhuan","1001","info","name");
//
// //扫描数据
// scanRows("bigdata","huanhuan","1001","1002");
//
// //测试过滤扫描数据
// filterRows("bigdata","huanhuan","1001","1002","info","name","欢欢");
//删除数据
deleteColumn("bigdata","huanhuan","1001","info","name");
//测试成功
System.out.println("测试成功");
//关闭连接
HBaseConnection.closeConnection();
}
}