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.删除时会删除最近版本的数据,查询会查询最近版本的数据
以上纯属个人见解,如有问题请联本人!