【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)

简介: 【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)

一、HBase数据模型

HBase分布式数据库的数据存储在行列式的表格中,它是一个多维度的映射模型,其数据模型如下所示。表的索引是行键,列族,列限定符和时间戳,表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,列族支持动态扩展,可以很轻松的添加一个列族或者列,无须预先定义列的数量及数据类型,所有列均以字符串形式存储

RowKey表示行键,每个HBase表中只能有一个行键,它在HBase中以字典序的方式存储。由于RowKey是HBase表的唯一标识,因此Row Key的设计非常重要。

HBase表的列是由列族名、限定符以及列名组成的,其中“:”为限定符。创建HBase表不需要指定列,因为列是可变的,非常灵活。

在HBase中,列族由很多列组成。在同一个表里,不同列族有完全不同的属性,但是同一个列族内的所有列都会有相同的属性,而属性都是定义在列族上的。

表示时间戳,记录每次操作数据的时间,通常记作数据的版本号。

二、HBase的Shell操作

HBase Shell提供大量操作HBase的命令,通过Shell命令很方便地操作HBase数据库,如创建、删除及修改表、向表中添加数据、列出表中的相关信息等操作。当使用Shell命令行操作HBase时,需要进入HBase Shell交互界面,执行“bin/hbase shell”命令进入到目录/hbase的界面。

在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。

1)显示hbase中的表l ist

2)创建表user,包含info、data两个列族

3)向user表中插入数据

4)获取user表中row key为rk0001的所有信息

5)获取user表中row key为rk0001,列族为info,版本号最新3个的信息 HBase2.0默认VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据。需要使用alter命令修改表的版本号。

清空表数据

添加列族

三、HBase的Java API操作

HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。

下面代码主要利用HBase常用的Java API进行表的创建,插入,删除等操作

package com.hadoop.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class HbaseApiDemo {
    //初始化Configuration对象
    private Configuration conf = null;
    //初始化连接
    private Connection conn = null;
    @Before
    public void init() throws Exception {
        //获取Configuration对象
        conf = HBaseConfiguration.create();
        //对于hbase的客户端来说,只需要知道hbase所经过的Zookeeper集群地址即可
          conf.set("hbase.zookeeper.quorum", "bigdata01:2181,bigdata02:2181,bigdata03:2181");
        //获取连接
        conn = ConnectionFactory.createConnection(conf);
    }
     @Test
    public void CreateTable() throws Exception {
        try {
            //获取操作对象
            Admin admin = conn.getAdmin();
            //构建一个user表
            TableDescriptorBuilder t_user = TableDescriptorBuilder.newBuilder(TableName.valueOf("t_user"));
             //创建列族  1
            ColumnFamilyDescriptor of = ColumnFamilyDescriptorBuilder.of("info");
            t_user.setColumnFamily(of);
            //创建列族  2
            ColumnFamilyDescriptor of1 = ColumnFamilyDescriptorBuilder.of("data");
            t_user.setColumnFamily(of1);
            //构建
            TableDescriptor build = t_user.build();
            //创建表
            admin.createTable(build);
            // 关闭连接
            admin.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testPut() throws Exception {
        //创建table对象,通过table对象来添加数据
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //创建一个集合,用于存放Put对象
        ArrayList<Put> puts = new ArrayList<Put>();
        //构建put对象(kv形式),并指定其行键
        Put put01 = new Put(Bytes.toBytes("rk002"));
        put01.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("username"), Bytes.toBytes("zhangsan"));
        put01.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("password"), Bytes.toBytes("345678"));
        Put put02 = new Put("rk003".getBytes());
        put02.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("username"), Bytes.toBytes("lisi"));
         //把所有的put对象添加到一个集合中
        puts.add(put01);
        puts.add(put02);
        //提交所有的插入数据的记录
        table.put(puts);
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testGet() throws IOException {
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //得到用于扫描region的对象
//        Scan scan = new Scan();
        Get get = new Get("rk002".getBytes());
        //使用HTable得到resultcanner实现类的对象
        Result result1 = table.get(get);
        List<Cell> cells = result1.listCells();
        for (Cell cell : cells) {
            //得到rowkey
            System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell)));
            //得到列族
            System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
        }
    }
    @Test
    public void testScan() throws Exception {
        //获取table对象
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //获取scan对象
        Scan scan = new Scan();
        //获取查询的数据
        ResultScanner scanner = table.getScanner(scan);
        //获取ResultScanner所有数据,返回迭代器
        Iterator<Result> iter = scanner.iterator();
        //遍历迭代器
        while (iter.hasNext()) {
            //获取当前每一行结果数据
            Result result = iter.next();
            //获取当前每一行中所有的cell对象
            List<Cell> cells = result.listCells();
            //迭代所有的cell
            for(Cell c:cells){
                //获取行键
                byte[] rowArray = c.getRowArray();
                //获取列族
                byte[] familyArray = c.getFamilyArray();
                //获取列族下的列名称
                byte[] qualifierArray = c.getQualifierArray();
                //列字段的值
                byte[] valueArray = c.getValueArray();
                //打印rowArray、familyArray、qualifierArray、valueArray
                System.out.println("行键:"+new String(rowArray, c.getRowOffset(),
                        c.getRowLength()));
                System.out.print("列族:"+new String(familyArray,c.getFamilyOffset(),
                        c.getFamilyLength()));
                System.out.print(" "+"列:"+ new String(qualifierArray,
                        c.getQualifierOffset(), c.getQualifierLength()));
                System.out.println(" "+"值:"+ new String(valueArray,
                        c.getValueOffset(), c.getValueLength()));
            }
            System.out.println("-----------------------");
        }
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testDel() throws Exception {
        //获取table对象
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //获取delete对象,需要一个rowkey
        Delete delete = new Delete("rk002".getBytes());
        //在delete对象中指定要删除的列族-列名称
        delete.addColumn("info".getBytes(), "password".getBytes());
        //执行删除操作
        table.delete(delete);
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testDrop() throws Exception {
        //获取一个表的管理器
        Admin admin = conn.getAdmin();
        //删除表时先需要禁用表
        admin.disableTable(TableName.valueOf("t_user"));
        admin.deleteTable(TableName.valueOf("t_user"));
        //关闭
        admin.close();
        conn.close();
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
4月前
|
JSON 安全 API
亚马逊商品列表API秘籍!轻松获取商品列表数据
亚马逊商品列表API(SP-API)提供标准化接口,支持通过关键词、分类、价格等条件搜索商品,获取ASIN、价格、销量等信息。采用OAuth 2.0认证与AWS签名,保障安全。数据以JSON格式传输,便于开发者批量获取与分析。
|
4月前
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
424 2
|
4月前
|
JSON 监控 API
小红书笔记评论API:一键获取分层评论与用户互动数据
小红书笔记评论API可获取指定笔记的评论详情,包括内容、点赞数、评论者信息等,支持分页与身份认证,返回JSON格式数据,适用于舆情监控、用户行为分析等场景。
|
5月前
|
供应链 监控 安全
1688商品详情API接口实战指南:合规获取数据,驱动B2B业务增长
1688商品详情API(alibaba.product.get)是合规获取B2B商品数据的核心工具,支持全维度信息调用,助力企业实现智能选品、供应链优化与市场洞察,推动数字化转型。
|
4月前
|
数据采集 JSON API
微店API使用指南:高效获取商品列表数据
本文介绍如何使用Python爬虫调用微店item_search接口,根据关键词搜索商品并获取商品列表数据,涵盖请求方式、JSON数据解析、分页参数设置及筛选排序功能,适用于电商数据分析与竞品研究。
|
4月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
4月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
4月前
|
自然语言处理 算法 数据可视化
看球总刷比分?好奇数据哪来的?你该认识一下「体育API」了
体育API是赛事数据的“幕后搬运工”,实时同步比分、赛程、球员统计等信息,支撑各类应用提供精准推送、深度分析与互动体验,让观赛更智能高效。
470 150
|
4月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
5月前
|
JSON 前端开发 API
如何调用体育数据足篮接口API
本文介绍如何调用体育数据API:首先选择可靠服务商并注册获取密钥,接着阅读文档了解基础URL、端点、参数及请求头,然后使用Python等语言发送请求、解析JSON数据,最后将数据应用于Web、App或分析场景,同时注意密钥安全、速率限制与错误处理。
595 152