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.刪除時會刪除最近版本的數據,查詢會查詢最近版本的數據

以上純屬個人見解,如有問題請聯本人!

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