package com.atguigu;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.List;

public class HBaseDML {
//添加静态属性connection指向单例连接
public static Connection connection = HBaseConnect01_单线程创建链接.connection;
public static void main(String[] args) throws IOException {
putCell("bigdata","student","1002","info", "name","lisi"); String cell =
getCells("bigdata","student","1002","info", "name"); System.out.println(cell);
List<String> strings = scanRows("bigdata","student","1001","2000"); for (String
string :strings){ System.out.println(string);
deleteColumn("bigdata","student","1002","info", "name"); } } /** * 插入数据 *
@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(columnFamily),Bytes.toBytes(value));
//2.3将对象写入对应的方法 try { table.put(put); } catch (IOException e) {
e.printStackTrace(); //throw new RuntimeException(e); } //3.关闭table
table.close(); } /** * 读取数据 读取对应的一行中的某一列 * * @param namespace 命名空间名称 * @param
tableName 表格名称 * @param rowKey 主键 * @param columnFamily 列族名称 * @param
columnName 列名 * @return */ public static String 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(); //throw new RuntimeException(e); }
//关闭table table.close(); return namespace; } /** * 扫描数据 * * @param namespace
命名空间 * @param tableName 表格名称 * @param startRow 开始的 row 包含的 * @param stopRow 结束的
row 不包含 * @return */ public static List<String> 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和withStopRow会报错。
// scan.withStartRow(Bytes.toBytes(startRow));
//默认不包含
// scan.withStopRow(Bytes.toBytes(stopRow));
try { //读取多行数据,获得scanner ResultScanner 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(); } //3.关闭table table.close(); return null;
} /** * 带过滤的扫描 * * @param namespace 命名空间 * @param tableName 表格名称 * @param
startRow 开始的 row 包含的 * @param stopRow 结束的 row 不包含 * @param columnFamily 列族名称 *
@param columnName 列名 * @param value value值 * @throws IOException */ public
static void filterScan(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 //默认包含
//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(singleColumnValueFilter); */ //添加过滤
scan.setFilter(filterList); try { //读取多行数据,获得scanner ResultScanner 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.cloneFamily(cell))+ "-" + new String(CellUtil.cloneValue(cell))
+ "\t"); } System.out.println(); } }catch (IOException e){ e.printStackTrace();
} //3.关闭table table.close(); } /** * 删除column数据 * * @param namespace 命名空间 *
@param tableName 表格名称 * @param rowKey * @param family * @param column 列名 *
@throws IOException */ public static void deleteColumn(String namespace,String
tableName,String rowKey,String family,String column) throws IOException {
//1.获取table Table table =
connection.getTable(TableName.valueOf(namespace,tableName)); //2.创建Delete对象
Delete delete = new Delete(Bytes.toBytes(rowKey)); //3.添加删除信息 //3.1删除单个版本
delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(column)); //3.2删除所有版本
delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(column)); //3.3删除列族
delete.addFamily(Bytes.toBytes(family)); //4.删除数据 table.delete(delete);
//5.关闭资源 table.close(); }
}// HBaseDML

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信