文档章节

奇葩的HBase API

 大胖和二胖
发布于 2016/10/28 17:33
字数 434
阅读 158
收藏 0

话不多说直接上代码:

Connection conn = ConnectionFactory.createConnection(conf);
TableName tn = TableName.valueOf(strTN);
Table table = conn.getTable(tn);
RowFilter logFileTableFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("0UAV0020109000574633450"));
Scan s = new Scan();
s.setFilter(logFileTableFilter);
ResultScanner ss = table.getScanner(s);
for (Result r : ss) {
    for (Cell cell : r.listCells()) {
        KeyValue kv = (KeyValue) cell;
        System.out.print(new String(Arrays.copyOfRange(kv.getFamilyArray(), kv.getFamilyOffset(), kv.getFamilyOffset() + kv.getFamilyLength())) + " ");
        System.out.print(new String(Arrays.copyOfRange(kv.getQualifierArray(), kv.getQualifierOffset(), kv.getQualifierOffset() + kv.getQualifierLength())) + " ");
        System.out.println(new String(Arrays.copyOfRange(kv.getValueArray(), kv.getValueOffset(), kv.getValueOffset() + kv.getValueLength())) + " ");
    }
}

前面部分都很正常,2层循环,第一层是循环result,简单理解就是循环row,第二层循环每一个field。

请注意我标出来的部分,看起来很容易理解,分别是取列族、列、值。

可是事情的真相却不是这样的,看下面这个图:

好吧,我们再看一下源码:

public byte[] getFamilyArray() {
    return this.bytes;
}
public byte[] getQualifierArray() {
    return this.bytes;
}
public byte[] getValueArray() {
    return this.bytes;
}

这tmd不是一样的东西嘛?

好吧,奇葩就奇葩吧,关键是不好用,大概意思就是给你一个byte数组,关于这个field的所有数据都在这个数组里面,然后告诉你列族、列、值等等各种东西的offset和length,让你自己去把东西抠出来。每次取值要是都得这么做,那不得疯掉~~~

Arrays.copyOfRange(kv.getValueArray(), kv.getValueOffset(), kv.getValueOffset() + kv.getValueLength())

看看下面这段代码,还是有正常点的api的,这才符合人类习惯嘛~~~~~~

for (Result r : ss) {
    NavigableMap<byte[], NavigableMap<byte[], byte[]>> maps = r.getNoVersionMap();
    for (byte[] fKey : maps.keySet()){
        NavigableMap<byte[], byte[]> map = maps.get(fKey);
        for (byte[] key : map.keySet()){
            System.out.print(new String(fKey) + ":");
            System.out.print(new String(key) + " ");
            System.out.println(new String(map.get(key)));
        }
    }
}

题外话:

号召大家都去学习scala,提一个很小的点,在java当中,我需要调用r.getNoVersionMap(),首先我要搞清楚它的返回值是什么类型,然后像上面那样写代码。但是如果是scala的话,一个val就搞定了,确实是方便啊~~~

© 著作权归作者所有

上一篇: Storm 分布式RPC
粉丝 23
博文 69
码字总数 50842
作品 0
沈阳
架构师
私信 提问
Hbase 中文参考指南 3.0 校对活动发车了~

参与方式:github.com/apachecn/hb… 整体进度:github.com/apachecn/hb… 项目仓库:github.com/apachecn/hb… 整体进度 章节 贡献者 进度 Preface @xixici 100% Getting Started @xixici 1......

ApacheCN_飞龙
03/22
0
0
Hive 数据导入HBase的2种方法详解

最近经常被问到这个问题,所以简单写一下总结。 Hive数据导入到HBase基本有2个方案: 1、HBase中建表,然后Hive中建一个外部表,这样当Hive中写入数据后,HBase中也会同时更新 2、MapReduce...

王二铁
2015/08/27
11.7K
0
分布式数据库 Apache HBase 2.0.0 第二个 Beta 版发布

Apache HBase 2.0.0 的第二个 Beta 版已发布,Apache HBase 2.0.0-beta-2 是 2.0 版本的非生产预览版,包含之前 alpha 版本中的所有新特性 (new assignment manager, offheap read/write pa...

局长
2018/03/08
1K
0
Apache HBase 1.2.5 发布,分布式数据库

Apache HBase 1.2.5 发布了,HBase 1.2.5 是 HBase 1.2 系列的最新维护版本,主要是为 Hadoop 和 NoSQL 社区带来稳定可靠的数据库。此版本包含自 1.2.4 版本发布以来的 50 多个已解决的问题。...

局长
2017/03/28
972
1
普及HBase,阿里云HBase团队在行动

一、HBase的历史由来 HBase是一个开源的非关系型分布式数据库(NoSQL),基于谷歌的BigTable建模,是一个高可靠性、高性能、高伸缩的分布式存储系统,使用HBase技术可在廉价PC Server上搭建起...

所在jason
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
3
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
3
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
4
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
6
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部