HBase:使用Java操作HBase(2)之table的操作

1.声明

当前内容主要用于本人学习和复习,当前的内容为使用构建模拟概念视图表并进行各种操作

当前构建的表来源于:模拟概念视图表

当前内容基于前面的博文:java操作HBase(1)

2.开始使用

import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
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.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 com.hy.hbase.HBaseUtils;

/**
 * @description 使用java方式创建模型表
 * @author hy
 * @date 2020-06-15
 */
public class CreateModelTableTest {
	private static String tableName = "webtable";
	private static String[] columnFamilies = { "contents", "anchor", "people" };

	public static void main(String[] args) throws IOException {
		HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.107:2181");
		Table table = null;
		Connection conn = null;

		boolean exists = hBaseUtils.exitstTable(tableName);
		if (exists) {
			hBaseUtils.deleteTable(tableName);
			System.out.println("表已存在。。。删除中。。。");
		}

		// 1.创建表
		hBaseUtils.createTable(tableName, columnFamilies);
		System.out.println("创建表成功!");
		conn = hBaseUtils.getConnection();
		table = conn.getTable(TableName.valueOf(tableName));
		// 2.列出所有的表名:类似list方法
		TableName[] listTableNames = hBaseUtils.listTableNames();
		System.out.println(Arrays.toString(listTableNames));
		// 3.为表中添加列族
		Admin admin = hBaseUtils.getAdmin();
		ColumnFamilyDescriptor cj = ColumnFamilyDescriptorBuilder.of("cj");
		admin.addColumnFamily(TableName.valueOf(tableName), cj);
		System.out.println("添加列族成功==>");
		table = conn.getTable(TableName.valueOf(tableName));
		System.out.println("显示所有列族==>" + table.getDescriptor());
		// 4.删除表中的列族
		admin.deleteColumnFamily(TableName.valueOf(tableName), "cj".getBytes());
		table = conn.getTable(TableName.valueOf(tableName));
		System.out.println("显示所有列族==>" + table.getDescriptor());
		// 5.添加表数据
		Put put = new Put("com.cnn.www".getBytes());
		put.addColumn("anchor".getBytes(), "cnnsi.com".getBytes(), 10009, "CNN".getBytes());
		put.addColumn("anchor".getBytes(), "my.look.ca".getBytes(), 10008, "CNN.com".getBytes());
		put.addColumn("contents".getBytes(), "html".getBytes(), 10006, "<html>…".getBytes());
		put.addColumn("contents".getBytes(), "html".getBytes(), 10005, "<html>…".getBytes());
		put.addColumn("contents".getBytes(), "html".getBytes(), 10003, "<html>…".getBytes());
		table.put(put);
		System.out.println("添加com.cnn.www的数据===>");
		Put put2 = new Put("com.example.www".getBytes());
		put2.addColumn("contents".getBytes(), "html".getBytes(), 10005, "<html>…".getBytes());
		put2.addColumn("people".getBytes(), "author".getBytes(), 10005, "John Doe".getBytes());
		table.put(put2);
		System.out.println("添加com.example.www的数据===>");

		conn = hBaseUtils.getConnection();
		table = conn.getTable(TableName.valueOf(tableName));

		// 6.扫描这个表
		System.out.println("扫描这个表中的所有数据===>");
		Scan scan = new Scan();
		ResultScanner scanner = table.getScanner(scan);
		Iterator<Result> iterator = scanner.iterator();
		while (iterator.hasNext()) {
			Result next = iterator.next();
			System.out.println(next);
		}
		scanner.close();
		// 7. 获取当前的com.cnn.www的行数据
		Get get = new Get("com.cnn.www".getBytes());
		Result result = table.get(get);
		System.out.println("获取当前的com.cnn.www这一行中的数据==>" + result);
		// 8.修改数据
		Put updatePut = new Put("com.example.www".getBytes());
		updatePut.addColumn("people".getBytes(), "author".getBytes(), "admin".getBytes());
		table.put(updatePut);
		Get adminGet = new Get("com.example.www".getBytes());
		adminGet.addColumn("people".getBytes(), "author".getBytes());
		Result adminResult = table.get(adminGet);
		System.out.println("获取的admin的数据的结果:===>" + adminResult);

		// 9.删除数据
		table.delete(new Delete("com.example.www".getBytes()).addColumn("people".getBytes(), "author".getBytes()));
		Result result2 = table.get(new Get("com.example.www".getBytes()));
		System.out.println("删除后的结果==>" + result2);
		//
		table.close();
		hBaseUtils.close();
	}
}

执行结果
在这里插入图片描述
从这个测试发现,如果删除某个row中的某个单元格数据(如果这个单元格存在多个时间维度的数据),那么删除的就是最近的一个数据,查询的时候会显示最近的一个数据

在这里插入图片描述

3.个人感觉

1.添加数据的时候需要将字符串转换为byte数组,比较麻烦,但是却可以在一个put中添加多个单元格数据

2.通过scan获取数据时,操作的时table对象

3.修改数据就是覆盖数据,删除数据就是删除最近时间的数据

4.重新封装到HBaseUtils中

/** 列族表数据添加修改删除 **/
	private Set<String> tableSet = new HashSet<String>();

	public Table getTable(String tableName) throws IOException {
		tableSet.add(tableName);
		return getConnection().getTable(tableName(tableName));
	}

	public void addColumnFamily(String tableName, String columnFamily) throws IOException {
		ColumnFamilyDescriptor add = ColumnFamilyDescriptorBuilder.of(columnFamily);
		getAdmin().addColumnFamily(tableName(tableName), add);
	}

	public void deleteColumnFamily(String tableName, String columnFamily) throws IOException {
		getAdmin().deleteColumnFamily(tableName(tableName), columnFamily.getBytes());
	}

	public void addData(String tableName, Put put) throws IOException {
		getTable(tableName).put(put);
	}

	public void addData(String tableName, String rowKey, String family, String qualifier, String value)
			throws IOException {
		Put put = new Put(rowKey.getBytes());
		put.addColumn(family.getBytes(), qualifier.getBytes(), value.getBytes());
		addData(tableName, put);
	}

	public void addData(String tableName, String rowKey, String family, String qualifier, int timestamp, String value)
			throws IOException {
		Put put = new Put(rowKey.getBytes());
		put.addColumn(family.getBytes(), qualifier.getBytes(), timestamp, value.getBytes());
		addData(tableName, put);
	}

	public void deleteData(String tableName, Delete delete) throws IOException {
		getTable(tableName).delete(delete);
	}

	public void deleteData(String tableName, String rowKey, String family, String qualifier) throws IOException {
		Delete delete = new Delete(rowKey.getBytes()).addColumn(family.getBytes(), qualifier.getBytes());
		deleteData(tableName, delete);
	}

	public Result getRowData(String tableName, String rowKey) throws IOException {
		Table table = getTable(tableName);
		Get get = new Get(rowKey.getBytes());
		Result result = table.get(get);
		return result;
	}

	public Result getCellData(String tableName, String rowKey, String family, String qualifier) throws IOException {
		Table table = getTable(tableName);
		Get get = new Get(rowKey.getBytes());
		get.addColumn(family.getBytes(), qualifier.getBytes());
		Result result = table.get(get);
		return result;
	}

	public List<Result> scanTable(String tableName, Scan scan) throws IOException {
		Table table = getTable(tableName);
		ResultScanner scanner = table.getScanner(scan);
		Iterator<Result> iterator = scanner.iterator();	
		List<Result> results = new ArrayList<Result>();
		while (iterator.hasNext()) {
			Result next = iterator.next();
			results.add(next);
		}
		scanner.close();
		return results;
	}

	public List<Result> scanTable(String tableName) throws IOException {
		return scanTable(tableName, new Scan());
	}

	public void close() throws IOException {
		for (String tableName : tableSet) {
			close(tableName);
		}
		close(getAdmin());
		close(getConnection());
	}

	public void close(String tableName) throws IOException {
		close(getTable(tableName));
	}

5.新的测试

private static String tableName = "webtable";
	private static String[] columnFamilies = { "contents", "anchor", "people" };

	public static void main(String[] args) throws IOException {
		HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.107:2181");

		boolean exists = hBaseUtils.exitstTable(tableName);
		if (exists) {
			hBaseUtils.deleteTable(tableName);
			System.out.println("表已存在。。。删除中。。。");
		}

		// 1.创建表
		hBaseUtils.createTable(tableName, columnFamilies);
		System.out.println("创建表成功!");

		// 2.列出所有的表名:类似list方法
		TableName[] listTableNames = hBaseUtils.listTableNames();
		System.out.println(Arrays.toString(listTableNames));
		// 3.为表中添加列族
		hBaseUtils.addColumnFamily(tableName, "cj");

		System.out.println("添加列族成功==>");
		System.out.println("显示所有列族==>" + hBaseUtils.getTable(tableName).getDescriptor());
		// 4.删除表中的列族
		hBaseUtils.deleteColumnFamily(tableName, "cj");

		System.out.println("显示所有列族==>" + hBaseUtils.getTable(tableName).getDescriptor());
		// 5.添加表数据
		hBaseUtils.addData(tableName, "com.cnn.www", "anchor", "cnnsi.com", 10009, "CNN");
		hBaseUtils.addData(tableName, "com.cnn.www", "anchor", "my.look.ca", 10008, "CNN");
		hBaseUtils.addData(tableName, "com.cnn.www", "contents", "html", 10006, "<html>…");
		hBaseUtils.addData(tableName, "com.cnn.www", "contents", "html", 10005, "<html>…");
		hBaseUtils.addData(tableName, "com.cnn.www", "contents", "html", 10003, "<html>…");
		System.out.println("添加com.cnn.www的数据===>");

		hBaseUtils.addData(tableName, "com.example.www", "contents", "html", 10005, "<html>…");
		hBaseUtils.addData(tableName, "com.example.www", "people", "author", 10005, "John Doe");
		System.out.println("添加com.example.www的数据===>");

		// 6.扫描这个表
		System.out.println("扫描这个表中的所有数据===>");
		List<Result> scanTable = hBaseUtils.scanTable(tableName);
		System.out.println(scanTable);

		// 7. 获取当前的com.cnn.www的行数据

		Result result = hBaseUtils.getRowData(tableName, "com.cnn.www");
		System.out.println("获取当前的com.cnn.www这一行中的数据==>" + result);
		// 8.修改数据
		hBaseUtils.addData(tableName, "com.example.www", "people", "author", "admin");
		Result adminResult = hBaseUtils.getCellData(tableName, "com.example.www", "people", "author");
		System.out.println("获取的admin的数据的结果:===>" + adminResult);

		// 9.删除数据
		hBaseUtils.deleteData(tableName, "com.example.www", "people", "author");
		Result result2 = hBaseUtils.getRowData(tableName, "com.example.www");

		System.out.println("删除后的结果==>" + result2);

		hBaseUtils.close();
	}

结果和上面一致

6.总结

1.当前的操作使用是通过table来实现的,使用方式基本上和前面的命令行操作差不多

2.删除时会删除最近版本的数据,查询会查询最近版本的数据

以上纯属个人见解,如有问题请联本人!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章