HBase Java常用API

    xiaoxiao2025-01-14  17

    HBase Java常用API

    常用API

    hbase类功能org.apache.hadoop.hbase.HBaseConfigurationHBase配置信息。默认的构造方法会尝试从hbase-default.xml和hbase-site.xml中读取配置。org.apache.hadoop.hbase.client.HBaseAdmin提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。org.apache.hadoop.hbase.HTableDescriptor包含了表的名字极其对应表的列族。org.apache.hadoop.hbase.HColumnDescriptor维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。org.apache.hadoop.hbase.client.HTable可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。org.apache.hadoop.hbase.client.Put用来对单个行执行添加操作。org.apache.hadoop.hbase.client.Get用来获取单个行的相关信息。

    常用操作

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import java.io.IOException; public class Template { public static Configuration configuration; // 配置信息 public static Connection connection; // 连接信息 public static Admin admin; // 对数据库进行管理,用于管理对表的创建删除等 // 建立连接 public static void init() { configuration = HBaseConfiguration.create(); configuration.set("hbase.rootdir", "hdfs://192.168.199.105:9000/hbase"); configuration.set("hbase.zookeeper.quorum", "192.168.199.105"); configuration.set("hbase.zookeeper.property.clientPort", "2181"); try { connection = ConnectionFactory.createConnection(configuration); admin = connection.getAdmin(); } catch (IOException e) { e.printStackTrace(); } } // 关闭连接 public static void close() { try { if (admin != null) { admin.close(); } if (null != connection) { connection.close(); } } catch (IOException e) { e.printStackTrace(); } } public static void createTable(String myTableName, String[] colFamily) throws IOException { /** * @Description: 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据 * @param: [myTableName, colFamily] [表名, 列族名] * @return: void */ init(); TableName tableName = TableName.valueOf(myTableName); if (admin.tableExists(tableName)) { System.out.println("表已存在!"); } else { HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName); // 对表信息进行管理的类 for (String str : colFamily) { HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str); // 对列族进行管理的类 hTableDescriptor.addFamily(hColumnDescriptor); } admin.createTable(hTableDescriptor); System.out.println("表" + myTableName + "创建成功"); } close(); } public static void deleteTable(String tableName) throws IOException { /** * @Description: 删除指定表 * @param: [tableName] 表名 * @return: void */ init(); TableName tn = TableName.valueOf(tableName); if (admin.tableExists(tn)) { // 先disable再delete admin.disableTable(tn); admin.deleteTable(tn); } close(); } public static void listTables() throws IOException { /** * @Description: 查看已有表 * @param: [] * @return: void */ init(); HTableDescriptor hTableDescriptors[] = admin.listTables(); for (HTableDescriptor hTableDescriptor : hTableDescriptors) { System.out.println(hTableDescriptor.getNameAsString()); } close(); } public static void insertRow(String tableName, String rowKey, String colFamily, String col, String val) throws IOException { /** * @Description: 向某一行的某一列插入数据 * @param: [tableName, rowKey, colFamily, col, val] [表名, 行键, 列族名, 列名(没有为空), 值] * @return: void */ init(); Table table = connection.getTable(TableName.valueOf(tableName)); Put put = new Put(rowKey.getBytes()); put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes()); table.put(put); table.close(); close(); } public static void deleteRow(String tableName, String rowKey, String colFamily, String col) throws IOException { /** * @Description: 删除数据 * @param: [tableName, rowKey, colFamily, col] [表名, 行键, 列族名, 列名] * @return: void */ init(); Table table = connection.getTable(TableName.valueOf(tableName)); Delete delete = new Delete(rowKey.getBytes()); // 删除指定列族的所有数据 // delete.addFamily(colFamily.getBytes()); // 删除指定列的数据 // delete.addColumn(colFamily.getBytes(), col.getBytes()); table.delete(delete); table.close(); close(); System.out.println("数据已删除"); } public static void getData(String tableName, String rowKey, String colFamily, String col) throws IOException { /** * @Description: 根据行键rowkey查找数据 * @param: [tableName, rowKey, colFamily, col] [tableName, rowKey, colFamily, col] * @return: void */ init(); Table table = connection.getTable(TableName.valueOf(tableName)); Get get = new Get(rowKey.getBytes()); get.addColumn(colFamily.getBytes(), col.getBytes()); Result result = table.get(get); showCell(result); table.close(); close(); } public static void showCell(Result result) { /** * @Description: 格式化输出 * @param: [result] * @return: void */ Cell[] cells = result.rawCells(); for (Cell cell : cells) { System.out.println("RowName:" + new String(CellUtil.cloneRow(cell)) + " "); System.out.println("Timetamp:" + cell.getTimestamp() + " "); System.out.println("column Family:" + new String(CellUtil.cloneFamily(cell)) + " "); System.out.println("row Name:" + new String(CellUtil.cloneQualifier(cell)) + " "); System.out.println("value:" + new String(CellUtil.cloneValue(cell)) + " "); } } public static void main(String[] args) throws IOException { // 创建一个表,表名为Score,列族为sname,course createTable("Score", new String[]{"sname", "course"}); // 在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空) // 等价命令:put 'Score','95001','sname','Mary' // insertRow("Score", "95001", "sname", "", "Mary"); // 在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列) // 等价命令:put 'Score','95001','score:Math','88' // insertRow("Score", "95001", "course", "Math", "88"); // 在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列) // 等价命令:put 'Score','95001','score:English','85' // insertRow("Score", "95001", "course", "English", "85"); // 1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math // 执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释 // 等价命令:delete 'Score','95001','score:Math' // deleteRow("Score", "95001", "course", "Math"); // 2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除) // 执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释 // 等价命令:delete 'Score','95001','score' // deleteRow("Score", "95001", "course", ""); // 3、删除Score表中指定行数据,其行键为95001 // 执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释 // 等价命令:deleteall 'Score','95001' // deleteRow("Score", "95001", "", ""); // 查询Score表中,行键为95001,列族为course,列为Math的值 // getData("Score", "95001", "course", "Math"); // 查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空) // getData("Score", "95001", "sname", ""); // 删除Score表 // deleteTable("Score"); } }
    最新回复(0)