c语言编程笔录

首页 >   > 笔记大全

笔记大全

HBase表的数据模型是什么

更新时间:2023-10-20

什么是HBase表

HBase是一个基于Hadoop的NoSQL数据库,可以处理非结构化和半结构化数据。HBase由列族(column family)和行键(row key)构成。表格分为多个列族,每个列族可以有任意数量的列。数据的行是由行键唯一标识的。

public class HBaseTableExample {

    public static void main(String[] args) throws IOException {

        //创建HBase配置实例
        Configuration conf = HBaseConfiguration.create();

        //创建HBase连接实例
        Connection connection = ConnectionFactory.createConnection(conf);

        //获取表格实例
        Table table = connection.getTable(TableName.valueOf("table_name"));

        //创建行键
        byte[] row = Bytes.toBytes("row_key");

        //创建列族
        byte[] cf = Bytes.toBytes("column_family");

        //创建列
        byte[] qualifier = Bytes.toBytes("qualifier");

        //创建值
        byte[] value = Bytes.toBytes("value");

        //向表格中插入数据
        Put put = new Put(row);
        put.addColumn(cf, qualifier, value);
        table.put(put);

        //关闭连接
        table.close();
        connection.close();
    }
}

HBase表的结构模型

HBase数据库在概念上类似于Google的BigTable服务。HBase每个表格由多行数据组成,每行数据由行键(row key)、列族(column family)、列标签(qualifier)、时间戳(timestamp)和单元值(value)组成。在HBase数据库中,表和列族是预定义的数据结构,而在HBase表格中,列是动态添加的,行也可以是动态添加的。

在HBase表格中,每个列族都有一个或多个列标签。HBase可以轻松地支持新列的添加,如果您添加了一个新的列标签,它将被自动添加到适当的列族中。但是,添加新的列族需要对表结构进行重新设计,因此在生产环境中需要谨慎使用。

public class HBaseTableExample {

    public static void main(String[] args) throws IOException {

        //创建HBase配置实例
        Configuration conf = HBaseConfiguration.create();

        //创建HBase连接实例
        Connection connection = ConnectionFactory.createConnection(conf);

        //获取表格实例
        Table table = connection.getTable(TableName.valueOf("table_name"));

        //创建行键
        byte[] row1 = Bytes.toBytes("row_key_1");

        //创建列族1
        byte[] cf1 = Bytes.toBytes("column_family_1");

        //创建列标签1
        byte[] qualifer1 = Bytes.toBytes("qualifier_1");

        //创建值1
        byte[] value1 = Bytes.toBytes("value_1");

        //向表格中插入数据
        Put put1 = new Put(row1);
        put1.addColumn(cf1, qualifer1, value1);
        table.put(put1);

        //创建列标签2
        byte[] qualifer2 = Bytes.toBytes("qualifier_2");

        //创建值2
        byte[] value2 = Bytes.toBytes("value_2");

        //向表格中插入数据
        Put put2 = new Put(row1);
        put2.addColumn(cf1, qualifer2, value2);
        table.put(put2);

        //创建行键
        byte[] row2 = Bytes.toBytes("row_key_2");

        //创建列族2
        byte[] cf2 = Bytes.toBytes("column_family_2");

        //创建列标签1
        byte[] qualifer3 = Bytes.toBytes("qualifier_3");

        //创建值3
        byte[] value3 = Bytes.toBytes("value_3");

        //向表格中插入数据
        Put put3 = new Put(row2);
        put3.addColumn(cf2, qualifer3, value3);
        table.put(put3);

        //关闭连接
        table.close();
        connection.close();
    }
}

HBase表的查询模型

HBase数据库是面向列族的,而不是关系型的。但是,HBase API提供了许多类似于SQL的查询工具,例如Scan和Filter。Scan是一种全部扫描表格的方法,对大型数据集最有效。(请注意,HBase并不是用来执行聚合操作的。这是Apache Hadoop MapReduce的任务)

public class HBaseTableExample {

    public static void main(String[] args) throws IOException {

        //创建HBase配置实例
        Configuration conf = HBaseConfiguration.create();

        //创建HBase连接实例
        Connection connection = ConnectionFactory.createConnection(conf);

        //获取表格实例
        Table table = connection.getTable(TableName.valueOf("table_name"));

        //创建扫描器
        Scan scan = new Scan();

        //设置扫描器的起始和结束行
        scan.setStartRow(Bytes.toBytes("row_start"));
        scan.setStopRow(Bytes.toBytes("row_stop"));

        //创建过滤器
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        filterList.addFilter(new SingleColumnValueFilter(
                Bytes.toBytes("column_family"),
                Bytes.toBytes("qualifier"),
                CompareOperator.EQUAL,
                Bytes.toBytes("value")));

        //将过滤器应用于扫描器
        scan.setFilter(filterList);

        //获取结果扫描器
        ResultScanner scanner = table.getScanner(scan);

        //迭代结果
        for (Result result : scanner) {

            //获取行键
            byte[] row = result.getRow();
            System.out.println(Bytes.toString(row));

            //获取值
            byte[] value = result.getValue(Bytes.toBytes("column_family"), Bytes.toBytes("qualifier"));
            System.out.println(Bytes.toString(value));
        }

        //关闭结果扫描器
        scanner.close();

        //关闭连接
        table.close();
        connection.close();
    }
}

总结

HBase表可以看作是一组行,每行都由唯一的行键、列族、列、时间戳和单元格值组成。表和列族是在创建表时预定义的,列则是动态添加的。HBase提供了广泛的API来支持表的操作,包括插入、查询和删除数据。在生产环境中,需要谨慎更新表结构,因为更新列族需要对表进行重新设计。

对于查询操作,HBase提供了一组类似于SQL的查询工具,例如Scan和Filter。Scan是一种全表扫描的方法,适用于大型数据集。而过滤器可以用于更细粒度的查询,例如按行键和单元格值过滤数据。

理解HBase数据模型是成为全栈程序员的基础,并学会如何编写代码进行表格操作和查询。此外,还需要根据特定情况做出明智的设计决策,例如创建适当的列族和合适的分区键,以确保高效的数据访问和管理。

通过使用HBase表来存储和处理非结构化和半结构化数据,全栈程序员可以更快地开发出功能强大的分布式应用程序,从而为用户带来更好的体验。