hbase api中常用的方法总结

1、createTable(String tableName, String[] fields)
创建表,参数 tableName 为表的名称,字符串数组 fields 为存储记录各个字段名称的数组。要求当 HBase已经存在名为 tableName 的表的时候,先删除原有的表,然后再创建新的表
①当前存在的表
在这里插入图片描述

②代码:

 public static void createTable(String tableName, String[] fields) throws IOException {
//取得与hbase集群连接方法
        try {
            init();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        TableName tabledn = TableName.valueOf(tableName);
        //定义表
        HTableDescriptor hTableDescriptor = new HTableDescriptor(tabledn);

        for (String str : fields) {
            //先定义列族,再创建表,即fields[]
            HColumnDescriptor cfdn = new HColumnDescriptor(str);
            hTableDescriptor.addFamily(cfdn);
        }
        //执行判断表是否存在
        if (admin.tableExists(hTableDescriptor.getTableName())) {
            System.out.println("该表存在,请先删除!");
            //若存在先停用表再删除
            admin.disableTable(hTableDescriptor.getTableName());
            admin.deleteTable(hTableDescriptor.getTableName());
        }


        admin.createTable(hTableDescriptor);
        System.out.println("创建成功");
        admin.close();
        connection.close();
}
//执行定义的方法
   public static void main(String[] args) throws IOException {
        createTable("tabledn",new String[]{"Score"});

    }

执行成功结果:
在这里插入图片描述

hbase shell查看表:
在这里插入图片描述

存在表后再次执行结果:
在这里插入图片描述

hbase shell查看表结构:
在这里插入图片描述

2、addRecord(String tableName,String row, String[] fields, String[] values)
向表 tableName、行 row(用 S_Name 表示)和字符串数组 fields 指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”、“Computer Science”、 “English”三列添加成绩时,字符串数组 fields 为{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values 存储这三门课的成绩。
①hbase shell查看表当前内容:
在这里插入图片描述

②代码:

  public static void addRecord(String tableName, String row, String[] fields, String[] values) throws IOException {
        try {
            init();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        TableName tabledn = TableName.valueOf(tableName);
        Table table=connection.getTable(tabledn);

        //添加内容操作
        //fields存放column的内容,在分号左边为列族,右边为列
        for (int i = 0; i < fields.length; i++) {
            Put put = new Put(row.getBytes());
            //以冒号进行分割fields里的数据,例如["Score","Math"]
            String[] cols = fields[i].split(":");
            if (cols.length == 1) {
                put.addColumn(cols[0].getBytes(), "".getBytes(), values[i].getBytes());
                //因为当输入的是单列族,split仅读出一个字符字符串,即cols仅有一个元素,对应获取values值
            } else {
                put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());
            }
            table.put(put);
        }
        System.out.println("添加数据成功");
        table.close();
        admin.close();
        connection.close();

}

 public static void main(String[] args) throws IOException {
        //调用方法测试数据
        addRecord("tabledn","row1",
                new String[]{"Score:Math","Score:Computer Science","Score:English"},
                new String[]{"60","70","90"});
    }

执行成功结果:
在这里插入图片描述

hbase shell查看表内容:
在这里插入图片描述

3、scanColumn(String tableName, String column)
浏览表 tableName 某一列的数据,如果某一行记录中该列数据不存在,则返回 null。
要求当参数 column 为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数 column 为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。
①hbase shell当前数据:
在这里插入图片描述

②代码:

    public static void scanColumn(String tableName, String column) throws IOException {
        try {
            init();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        TableName tabledn = TableName.valueOf(tableName);
        Table table = connection.getTable(tabledn);

        Scan scan = new Scan();
        //将column内容用冒号进行分割,如若长度为1,即只有列族无列,直接获取列族,否则取整个column里的值
        String[] cols = column.split(":");
        if (cols.length == 1) {
            scan.addFamily(Bytes.toBytes(column));
        } else {
            scan.addColumn(Bytes.toBytes(cols[0]), Bytes.toBytes(cols[1]));
        }

        //定义扫描器,对数据进行扫描
        ResultScanner scanner = table.getScanner(scan);
        for (Result result = scanner.next(); result != null; result = scanner.next()) {
            showCell(result);
        }
        table.close();
        admin.close();
        connection.close();

    }

    public static void showCell(Result result) {
        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("column Name(列名):" + new String(CellUtil.cloneQualifier(cell)) + " ");
            System.out.println("value:(值)" + new String(CellUtil.cloneValue(cell)) + " ");
            System.out.println();
        }
}


  public static void main(String[] args) throws IOException {
        //列数据不存在情况
        scanColumn("tabledn", "Score:Chinese");
        System.out.println("------------------------------------------------");
        //扫描列族的情况
        scanColumn("tabledn", "Score");
        System.out.println("------------------------------------------------");
        //扫描具体列的情况
        scanColumn("tabledn", "Score:Math");

    }

执行成功结果:
在这里插入图片描述

4、modifyData(String tableName, String row, String column)
修改表 tableName,行 row(可以用学生姓名 S_Name 表示),列 column 指定的单元格的数据。将"person"表 "Score:“Math"值修改为"100”。
①查看当前表的数据:
在这里插入图片描述

②代码:

  public static void modifyData(String tableName, String row, String column, String value) throws IOException {

        try {
            init();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        //获取需要修改表内容的表名
        TableName tabledn = TableName.valueOf(tableName);
        Table table = connection.getTable(tabledn);

        //没有特定的修改操作,是用添加数据来直接更改的,只要列簇名列名是一样的,可以直接修改values
        Put put = new Put(row.getBytes());
        String[] cols = column.split(":");
        if (cols.length == 1) {
            put.addColumn(column.getBytes(), "".getBytes(), value.getBytes());//qualifier:列族下的列名
        } else {

            put.addColumn(cols[0].getBytes(), cols[1].getBytes(), value.getBytes());//qualifier:列族下的列名
        }
        table.put(put);
        table.close();
        admin.close();
        connection.close();
}

  public static void main(String[] args) throws IOException {
        modifyData("tabledn", "row1", "Score:Math", "100");
    }

执行成功结果:
在这里插入图片描述

hbase shell查看修改后的数据:
在这里插入图片描述

5、deleteRow(String tableName, String row)删除表tableName 中row指定的行的记录
,tableName=Score,row=s002,columnFamily=Score,column=math。
①在表中添加一行s002测试数据:
在这里插入图片描述

②代码:

   public static void deleteRow(String tableName, String row) throws IOException {
        try {
            init();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        //定义表名
        // TableName tabledn = TableName.valueOf("tabledn");
        //获取需要删除表内容的表名
        TableName tabledn = TableName.valueOf(tableName);
        Table table = connection.getTable(tabledn);

        Delete delete = new Delete(row.getBytes());
        table.delete(delete);
        System.out.println("删除成功");
        table.close();
        admin.close();
        connection.close();

}

    public static void main(String[] args) throws IOException {
        deleteRow("tabledn", "s002");
    }

执行成功结果:
在这里插入图片描述

hbase shell查看删除结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侬本多情。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值