HBase CURD之Get

下面我们将介绍从客户端API中获取已存数据的方法。HTable类中提供了get()方法,同时还有与之对应的Get类。get方法分为两类:一类是一次获取一行数据;另一类是一次获取多行数据。

单行get

下面是示例代码:

@Test
public void testGet() throws IOException {
    Connection conn = ConnectionFactory.createConnection();
    Table table = conn.getTable(TableName.valueOf("ns1:t1"));
    Get get = new Get(Bytes.toBytes("row93"));
    Result r = table.get(get);
    List<Cell> cells = r.listCells();
    for (Cell c : cells){
        String rowKey = Bytes.toString(CellUtil.cloneRow(c));
        String family = Bytes.toString(CellUtil.cloneFamily(c));
        String column = Bytes.toString(CellUtil.cloneQualifier(c));
        String value = Bytes.toString(CellUtil.cloneValue(c));

        System.out.println(rowKey + "," + family + "," + column + "," + value);
    }
}

从上面代码可以看出,数据的查询是通过Table的get方法获取的,get方法对应着Get对象。下面看一下Get类的构造函数。

Get构造函数

public Get(byte [] row) // 指定rowKey
public Get(Get get)     // 从其他Get对象创建实例

Tip

虽然一次get操作只能读取一行数据,但不会限制一行当中取多少列或者多少单元格。

与put操作一样,用户有许多方法可用,可以通过多种标准筛选目标数据,也可以指定精确的坐标获取某个单元格的数据:

Get addFamily(byte [] family)                   // 限制get请求只能取得一个制定的列族,要取得多个列族时需要多次调用。
Get addColumn(byte [] family,byte [] qualifier) // 用户通过他可以指定get取得那一列的数据,从而进一步缩小地址空间。
Get setTimeRange(long minStamp,long maxStamp)   // 设置只能在制定的时间戳范围获得列版本。
Get setTimeStamp(long timestamp)                // 获得带有制定时间戳的列的版本。
Get setMaxVersions()                            // 设置最大版本数,设置为最大版本数为Integer的最大值。
Get setMaxVersions(int maxVersions)

addFamily()方法限制get请求只能取得一个指定的列族,要取得多次调用。addColumn()方法的使用与之类似,用户通过它可以指定get取得哪一列的数据,从而进一步缩小地址空间。有一些方法允许用户设定要获取的数据的时间戳,或者通过设定一个时间段来取得时间戳属于该时间段内的数据。

最后,如果用户没有设定时间戳的话,也有方法允许用户设定要获取的数据的版本数目。默认情况下,版本数为1,即get方法请求返回最新的匹配版本。如果有疑问,可以使用getMaxVersions()来检查这个Get实例所要取出的最大版本数。不带参数的setMaxVersions()方法会把要取出的最大版本数设为Integer.MAX_VALUE,这是用户在单元格中所有的版本,换句话说,此时系统会返回用户在列族中已配置的最大版本数以内的数据。

Get类中的其他常用方法

方法 描述
getRow() 返回创建Get实例时指定的行键
getTimeRange() 返回指定的Get实例的时间戳范围
setFilter()/getFilter() 用户可以使用该一个特定的过滤器实例,通过多种规则和条件来筛选列和单元格。
setCacheBlocks()/getCacheBlocks() 每个HBase的region服务器都有一个块缓存来有效地保存最近存取过的数据,并以此来加速之后的相邻信息的读取。不过在某些情况下,例如完全随机读取时,最好能避免这种机制带动的干扰。这些方法能够控制档次读取的块缓存机制是否起效。
numFamilies() 快捷地获取列族FamilyMap大小的方法,包括用addFamily()方法和addColumn()方法添加的列族。
hasFamilies() 检查列族或列是否存在于当前的Get实例中
familySet()/getFamilyMap() 这些方法能够让用户直接访问addFamily()和addColumn()添加的列族和列。FamilyMap列族中键是列族的名称,键对应的值是指定列族的限定符列表。familySet()方法返回一个所有已存储列族的Set,即一个只包含列族名的集合。

Result类

当用户使用get()方法获取数据时,HBase返回的结果包含所有匹配的单元格数据,这些数据将被封装在一个Result实例中返回给用户。用它提供的方法,可以从服务器端获取匹配指定行的特定返回值,这些值包括列族、列限定符和时间戳等。常用方法如下:

byte[] getValue(byte[] family,byte[] qualifier) // 方法允许用户取得一个HBase中存储的特定单元格的值。因为该方法不能指定时间戳,所以用户只能获取数据最新的版本。
byte [] value()                                 // 返回第一个列对应的最新单元格的值。
byte [] getRow()                                // 返回创建Get对象当前实例中的rowKey
int size()                                      // 返回Cell实例的数目
boolean isEmpty()                               // 查看键值对的数目是否大于0
Cell[] rawCells()                               // 返回的数组已经按照字典序排列;排序规则是先按列族排序,列族内再按列限定符排序,此后再按时间戳排序,最后按类型排序。
List<Cell> listCells()                          // 返回所有Cell对象的集合
List<Cell> getColumnCells(byte [] family, byte [] qualifier)  // 返回特定列的单元格
Cell getColumnLatestCell(byte [] family, byte [] qualifier)   // 返回最新版本的Cell对象
boolean containsColumn(byte [] family, byte [] qualifier)     // 检查指定列的值是否存在

字典排序规则

排序规则是先按列族排序,列族内再按列限定符排序,此后再按时间戳排序,最后按类型排序。

Get列表

使用列表参数的get()方法与使用列表参数的put方法对应,用户可以用一次请求获取多行数据。它允许用户快速高效的从远程服务器获取相关的或完全随机的多行数据。

@Test
public void testGet2() throws IOException {
    Connection conn = ConnectionFactory.createConnection();
    Table table = conn.getTable(TableName.valueOf("ns1:t1"));
    List<Get> list = new ArrayList<Get>();
    Get get1 = new Get(Bytes.toBytes("row93"));
    Get get2 = new Get(Bytes.toBytes("row94"));
    Get get3 = new Get(Bytes.toBytes("row95"));
    list.add(get1);
    list.add(get2);
    list.add(get3);
    Result[] results = table.get(list);
    for (Result r : results){
        List<Cell> cells = r.listCells();
        for (Cell c : cells){
            String rowKey = Bytes.toString(CellUtil.cloneRow(c));
            String family = Bytes.toString(CellUtil.cloneFamily(c));
            String column = Bytes.toString(CellUtil.cloneQualifier(c));
            String value = Bytes.toString(CellUtil.cloneValue(c));

            System.out.println(rowKey + "," + family + "," + column + "," + value);
        }
    }
}

@Test
public void testGet3() throws IOException {
    Connection conn = ConnectionFactory.createConnection();
    Table table = conn.getTable(TableName.valueOf("ns1:t1"));
    List<Get> list = new ArrayList<Get>();
    Get get1 = new Get(Bytes.toBytes("row93"));
    Get get2 = new Get(Bytes.toBytes("row94"));
    Get get3 = new Get(Bytes.toBytes("row95"));
    list.add(get1);
    list.add(get2);
    list.add(get3);
    Result[] results = table.get(list);
    for (Result r : results){
        List<Cell> cellsId = r.getColumnCells(Bytes.toBytes("f1"),Bytes.toBytes("id"));
        for (Cell cid: cellsId) {
            int id = Bytes.toInt(CellUtil.cloneValue(cid));
            System.out.println(id);
        }
        List<Cell> cellsAges = r.getColumnCells(Bytes.toBytes("f1"),Bytes.toBytes("age"));
        for (Cell cage: cellsAges) {
            int age = Bytes.toInt(CellUtil.cloneValue(cage));
            System.out.println(age);
        }
        List<Cell> cellsNames = r.getColumnCells(Bytes.toBytes("f1"),Bytes.toBytes("name"));
        for (Cell cname : cellsNames) {
            String name = Bytes.toString(CellUtil.cloneValue(cname));
            System.out.println(name);
        }
    }
}


@Test
public void testGet4() throws IOException {
    Connection conn = ConnectionFactory.createConnection();
    Table table = conn.getTable(TableName.valueOf("ns1:t1"));
    List<Get> list = new ArrayList<Get>();
    Get get1 = new Get(Bytes.toBytes("row93"));
    Get get2 = new Get(Bytes.toBytes("row94"));
    Get get3 = new Get(Bytes.toBytes("row95"));
    list.add(get1);
    list.add(get2);
    list.add(get3);
    Result[] results = table.get(list);
    for (Result r : results){
        Cell cellsId = r.getColumnLatestCell(Bytes.toBytes("f1"),Bytes.toBytes("id"));
        int id = Bytes.toInt(CellUtil.cloneValue(cellsId));
        System.out.println(id);

        Cell cellsAge = r.getColumnLatestCell(Bytes.toBytes("f1"),Bytes.toBytes("age"));
        int age = Bytes.toInt(CellUtil.cloneValue(cellsAge));
        System.out.println(age);

        Cell cellsName = r.getColumnLatestCell(Bytes.toBytes("f1"),Bytes.toBytes("name"));
        String name = Bytes.toString(CellUtil.cloneValue(cellsName));
        System.out.println(name);

    }
}

获取数据的其他方法

boolean exists(Get get)             // 测试表中的列是否存在。如果存在返回true,这是一个服务器端调用,防止任何数据转移到客户端。
boolean[] existsAll(List<Get> gets) // 与上面方法功能类似,只不过返回的是boolean数组

Tip

exists()和existsAll()方法会引发regionServer端查询数据的操作,包括加载文件块来检查某行或某列是否存在。用户通过这种方法只能避免网络数据传输的开销,不过在需要检查或频繁检查一个比较大的列时,这种方法还是十分实用的。

原文链接:http://blog.csdn.net/u010521842/article/details/77661386

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,544评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 今天开始恢复自己的晨读,惭愧,不找理由和借口,只去行动和改变。 查理是巴菲特的黄金搭档,我一直认为,成功的人身上一...
    奔跑的丸子啊阅读 487评论 0 50
  • 动画 所谓动画就是使一幅图像“活”起来的过程。当眼睛看到多张图片连续快速的切换时,就会被认为是一段连续播放的动画。...
    CatchZeng阅读 1,220评论 6 23