3.4 DML

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 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 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

你可能感兴趣的:(hbase,java,hadoop)