HBase API 基础操作

Hbase-1.1.2 Java API 操作 前期准备: Hbase-1.1.2 Java开发需要的最少Jar包 下面的代码是根据最新的Hbase-1.1.2 Java API 进行的基础操作。 import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configurat 阅读详情

对于数据操作,HBase支持四类主要的数据操作,分别是: 

  • Put :增加一行,修改一行
  • Delete :删除一行,删除指定列族,删除指定column的多个版本,删除指定column的制定版本等
  • Get :获取指定行的所有信息,获取指定行和指定列族的所有colunm,获取指定column,获取指定column的几个版本, 获取指定column的指定版本等
  • Scan :获取所有行,获取指定行键范围的行,获取从某行开始的几行,获取满足过滤条件的行等 

1. 命名空间NameSpace

在关系数据库系统中,命名空间NameSpace指的是一个表的逻辑分组 ,同一分组中的各个表有类似的用途。命名空间的概念为即将到来的多租户特性打下基础:
配额管理(Quota Management (HBASE-8410)):限制一个NameSpace可以使用的资源,资源包括region和table等
命名空间安全管理(Namespace Security Administration (HBASE-9206)):提供了另一个层面的多租户安全管理
Region服务器组(Region server groups (HBASE-6721)):一个命名空间或一张表,可以被固定到一组 RegionServers上,从而保证了数据隔离性。

1.1.命名空间管理
命名空间可以被创建、移除、修改。表和命名空间的隶属关系 在在创建表时决定,通过以下格式指定:<namespace>:<table>
Example:hbase shell中相关命令:

复制代码
//Create a namespace
create_namespace 'my_ns'

//create my_table in my_ns namespace
create ' my_ns:my_table', 'fam'

//drop namespace
drop_namespace 'my_ns'

//alter namespace
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
复制代码

1.2. 预定义的命名空间
有两个系统内置的预定义命名空间:
hbase:系统命名空间,用于包含hbase的内部表
default:所有未指定命名空间的表都自动进入该命名空间(默认的)

Example:指定命名空间和默认命名空间

//namespace=foo and table qualifier=bar
create 'foo:bar', 'fam'

//namespace=default and table qualifier=bar
create 'bar', 'fam'

2.创建表 

复制代码
private static void createTable() throws MasterNotRunningException,
        ZooKeeperConnectionException, IOException {
    /**
     * create()方法有两个静态方法,无参和有参数
     * 无参数:hadoop的core-site.xml配置的参数会被后面的覆盖
     * 有参数:hadoop的core-site.xml配置的参数无法修改
     */
    Configuration conf = HBaseConfiguration.create();
// the location of hbase on hdfs conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase"); // the node of zookeeper conf.set("hbase.zookeeper.quorum", "ncst");
    conf.set("hbase.client.keyvalue.maxsize", "100*1024*1024");// 上传文件的大小默认是10M
    conf.addResource("classpath: ./hbase-site.xml");

HBaseAdmin hba = new HBaseAdmin(conf);
// create namespace named 'ns' hba.createNamespace(NamespaceDescriptor.create("ns").build());
// create table named 'ns:t1' TableName tname = TableName.valueOf("ns:t1");
// Analyzing table exists if(!hba.tableExists(tname)){ HTableDescriptor htd = new HTableDescriptor(tname);
// add column 'f1' to table 't1' HColumnDescriptor hcd = new HColumnDescriptor("f1"); htd.addFamily(hcd);
//create table now hba.createTable(htd); } hba.close();}
复制代码

注意:
1). 必须将HBase集群的hbase-site.xml文件添加进工程的classpath中,否则 Configuration conf = HBaseConfiguration. create()代码获取不到需要的集群相关信息,也就无法找到集群,运行程序时会报错。即conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase"); 和 conf.set("hbase.zookeeper.quorum", "ncst"); 不可缺少!
2). 代码HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("ns:t1"));是描述表t1,并将t1添加到ns命名空间中,前提是该命名空间已存在,如果不存在则会报错NamespaceNotFoundException
3). 命名空间一般在建模阶段通过命令行创建,在java代码中通过hba.createNamespace(NamespaceDescriptor.create("ns").build());创建的机会不多
4). 创建 HBaseAdmin 对象时就已经建立了客户端程序与HBase集群的connection,所以在程序执行完成后,务必通过 hba.close(); 关闭connection

5). 可以通过 HTableDescriptor 对象设置Table的相关特性 ,比如: 

复制代码
//日志flush的时候是同步写,还是异步写
htd.setDurability(Durability.SYNC_WAL);
//region size大小,当一个region中的最大store文件达到这个size时,region就开始分裂 htd.setMaxFileSize(1024*1024*1024);
//MemStore大小,当memstore达到这个值时,开始往磁盘中刷数据 htd.setMemStoreFlushSize(256*1024*1024);
复制代码

6). 由于HBase的数据是先写入内存,数据累计达到内存阀值时才往磁盘中flush数据,所以,如果在数据还没有flush进硬盘时,RegionServer down掉了,内存中的数据将丢失。想解决这个场景的问题就需要用到WAL(Write-Ahead-Log),htd.setDurability(Durability.SYNC_WAL); 就是设置写WAL日志的级别,示例中设置的是同步写WAL,该方式安全性较高,但无疑会一定程度影响性能,请根据具体场景选择使用

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待
两者区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

7). setDurability(Durability d)方法可以在相关的三个对象中使用,分别是:HTableDescriptor,Delete,Put。其中Delete和Put的该方法都是继承自父类org.apache.hadoop.hbase.client.Mutation。分别针对表、插入操作、删除操作设定WAL日志写入级别。需要注意的是,Delete和Put并不会继承Table的Durability级别(已实测验证)。Durability是一个枚举变量,如果不通过该方法指定WAL日志级别,则为默认USE_DEFAULT级别

8). 可以通过 HColumnDescriptor 对象设置ColumnFamily的特性 ,比如:

复制代码
//压缩内存中和存储文件中的数据,默认NONE(不压缩)
//PREFIX-TREE算法以后详述
hcd.setDataBlockEncoding(DataBlockEncoding.PREFIX);

//bloom过滤器:NONE,ROW(默认值)和ROWCOL.ROWCOL除了过滤ROW还要过滤列族 
hcd.setBloomFilterType(BloomType.ROW);

//集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL(默认值)就不能被复制了 
hcd.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);

//数据保存的最大版本数.默认是Long.MAX
hcd.setMaxVersions(3);

//数据保存的最小版本数.默认是1.配合TTL使用
hcd.setMinVersions(1);

//数据保存的最长时间,即TTL,单位是ms
hcd.setTimeToLive(18000);

//设定数据存储的压缩类型.默认无压缩(NONE)
hcd.setCompressionType(Algorithm.SNAPPY);

//是否保存那些已经删除掉的cell
hcd.setKeepDeletedCells(false);

//设置数据保存在内存中以提高响应速度
hcd.setInMemory(true);

//块缓存,保存着每个HFile数据块的startKey 
hcd.setBlockCacheEnabled(true);

//块的大小,默认值是65536
hcd.setBlocksize(64*1024);
复制代码

2.1.列出所有的表

复制代码
//listTableNames例子
private static void listTable() throws MasterNotRunningException,
        ZooKeeperConnectionException, IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HBaseAdmin hba
= new HBaseAdmin(conf);
TableName[] listTableNames
= hba.listTableNames(); for (TableName tableName : listTableNames) { System.out.println(tableName.toString()); } hba.close(); }
复制代码

3.删除表

说明:删除表前必须先disable表

复制代码
private static void dropTable() throws MasterNotRunningException,
        ZooKeeperConnectionException, IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HBaseAdmin hba
= new HBaseAdmin(conf);
TableName tableName
= TableName.valueOf("t1"); if(hba.tableExists(tableName)){
//Must disable table at first hba.disableTable(tableName);

//delete table hba.deleteTable(tableName); } hba.close(); }
复制代码

4.修改表

4.1.删除列族 and 新增列族

通过 HTableDescriptor htd = hba.getTableDescriptor(tablename.getBytes()); 取得目标表的描述对象,通过 hba.modifyTable(tablename, htd); 将修改后的描述对象应用到目标表

复制代码
private static void modifyCF() throws MasterNotRunningException,
        ZooKeeperConnectionException, IOException, TableNotFoundException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HBaseAdmin hba
= new HBaseAdmin(conf);
String tablename
= "nc:t1"; if(hba.tableExists(tablename)){ //disable table hba.disableTable(tablename); HTableDescriptor htd = hba.getTableDescriptor(tablename.getBytes()); //delete column family named 'f1' htd.removeFamily("f1".getBytes()); //add new column family HColumnDescriptor hcd = new HColumnDescriptor("info"); hcd.setMaxVersions(3); hcd.setInMemory(true); htd.addFamily(hcd); //modify target table hba.modifyTable(tablename, htd); //enable table hba.enableTable(tablename); } hba.close(); }
复制代码

4.2.修改现有列族的属性(setMaxVersions)

复制代码
private static void ModifyCFAttribute() throws MasterNotRunningException,
        ZooKeeperConnectionException, IOException, TableNotFoundException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HBaseAdmin hba
= new HBaseAdmin(conf);
String tablename
= "nc:t1"; if(hba.tableExists(tablename)){ hba.disableTable(tablename); HTableDescriptor htd = hba.getTableDescriptor(tablename.getBytes()); //get target column family HColumnDescriptor family = htd.getFamily("info".getBytes()); family.setMaxVersions(5); //modify table hba.modifyTable(tablename, htd); } hba.close(); }
复制代码

5.插入数据Put

5.1.常用构造函数:
指定行键:public Put(byte[] row)
指定行键和时间戳:public Put(byte[] row, long ts)
从目标字符串中提取子串,作为行键:Put(byte[] rowArray, int rowOffset, int rowLength)
从目标字符串中提取子串,作为行键,并加上时间戳:Put(byte[] rowArray, int rowOffset, int rowLength, long ts)

5.2.Put常用方法:
指定列族和限定符,添加值:add(byte[] family, byte[] qualifier, byte[] value)
指定列族,限定符和时间戳,添加值:add(byte[] family, byte[] qualifier, long ts, byte[] value)
设置写WAL(Write-Ahead-Log)的级别:public void setDurability(Durability d)
参数是一个枚举值,可以有以下几种选择:

  • ASYNC_WAL : 当数据变动时,异步写WAL日志
  • SYNC_WAL : 当数据变动时,同步写WAL日志
  • FSYNC_WAL : 当数据变动时,同步写WAL日志,并且,强制将数据写入磁盘
  • SKIP_WAL : 不写WAL日志
  • USE_DEFAULT : 使用HBase全局默认的WAL写入级别,即 SYNC_WAL
复制代码
private static void putOneRecord() throws IOException,
        InterruptedIOException, RetriesExhaustedWithDetailsException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "nc:t1"); //RowKey Put put = new Put("xiaoming".getBytes()); //column family, column, value put.add("info".getBytes(), "age".getBytes(), "18".getBytes()); put.setDurability(Durability.SYNC_WAL); //put a record ht.put(put); ht.close(); }
复制代码

注意:
1). Put的构造函数都需要指定行键,如果是全新的行键,则新增一行;如果是已有的行键,则更新现有行
2). 创建Put对象及put.add(***)过程都是在构建一行的数据:创建Put对象时相当于创建了行对象,add的过程就是往目标行里添加cell,直到table.put(***)才将数据插入表格

3). Put的其他构造函数 Put put = new Put("100001_100002".getBytes(),7,6); 第二个参数是偏移量,也就是从第一个参数的第几个字符开始截取RowKey,第三个参数是截取长度。这个代码实际是从 100001_100002 中截取了100002子串作为目标行的RowKey。

6.删除数据Delete
Delete类用于删除表中的一行数据,通过HTable.delete来执行该动作。
在执行Delete操作时,HBase并不会立即删除数据,而是对需要删除的数据打上一个“墓碑”标记,直到当Storefile合并时,再清除这些被标记上“墓碑”的数据。
如果希望删除整行,用行键来初始化一个Delete对象即可。如果希望进一步定义删除的具体内容,可以使用以下这些Delete对象的方法:

  • 为了删除指定的列族,可以使用 deleteFamily
  • 为了删除指定列的多个版本,可以使用 deleteColumns
  • 为了删除指定列的指定版本 ,可以使用 deleteColumn,这样的话就只会删除版本号与指定版本相同的列。如果不指定时间戳,默认只删除最新的版本

6.1.构造函数
  1). 指定要删除的行键:Delete(byte[] row)
删除行键指定行的数据。如果没有进一步的操作,使用该构造函数将删除行键指定的行中所有列族中所有列的所有版本 !
  2). 指定要删除的行键和时间戳:Delete(byte[] row, long timestamp)
删除行键和时间戳共同确定行的数据。如果没有进一步的操作,使用该构造函数将删除行键指定的行中,所有列族中所有列的时间戳【小于等于】指定时间戳的数据版本 !
注意 :该时间戳仅仅和删除行有关,如果需要进一步指定列族或者列,你必须分别为它们指定时间戳。
  3). 给定一个字符串,目标行键的偏移,截取的长度:Delete(byte[] rowArray, int rowOffset, int rowLength)
  4).给定一个字符串,目标行键的偏移,截取的长度,时间戳:Delete(byte[] rowArray, int rowOffset, int rowLength, long ts)

6.2.常用方法
  1).删除指定列的 最新版本 的数据:Delete deleteColumn (byte[] family, byte[] qualifier) 
  2).删除指定列的 指定版本 的数据:Delete deleteColumn (byte[] family, byte[] qualifier, long timestamp ) 
  3).删除指定列的 所有版本 的数据:Delete deleteColumns (byte[] family, byte[] qualifier)
  4).删除指定列的,时间戳 小于等于 给定时间戳的 所有版本 的数据:Delete deleteColumns (byte[] family, byte[] qualifier, long timestamp ) 
  5).删除指定列族的所有列的 所有版本 数据:Delete deleteFamily (byte[] family) 
  6).删除指定列族的所有列中 时间戳 小于等于 指定时间戳 的所有数据:Delete deleteFamily (byte[] family, long timestamp) 
  7).删除指定列族中 所有列的时间戳 等于 指定时间戳的版本数据:Delete deleteFamilyVersion (byte[] family, long timestamp) 
  8).为Delete对象设置时间戳:void setTimestamp (long timestamp)

复制代码
private static void deleteColumn() throws IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
    HTable ht = new HTable(conf, "nc:t1");    
    
    //RowKey
    Delete delete = new Delete("xiaoming".getBytes());
    
    //Column
    delete.deleteColumn("info".getBytes(), "age".getBytes());
    
    ht.delete(delete);
    ht.close();
}
复制代码

7.获取单行Get
如果希望获取整行数据,用行键初始化一个Get对象就可以,如果希望进一步缩小获取的数据范围,可以使用Get对象的的方法.

7.1.构造函数

Get的构造函数很简单,只有一个构造函数: Get(byte[] row) 参数是行键。

7.2.Get对象常用方法

  1). Get addFamily(byte[] family) 指定希望获取的列族
  2). Get addColumn(byte[] family, byte[] qualifier) 指定希望获取的列
  3). Get setTimeRange(long minStamp, long maxStamp) 设置获取数据的 时间戳范围
  4). Get setTimeStamp(long timestamp) 设置获取数据的时间戳
  5). Get setMaxVersions(int maxVersions) 设定获取数据的版本数
  6). Get setMaxVersions() 设定获取数据的所有版本
  7). Get setFilter(Filter filter) 为Get对象添加过滤器,过滤器详解请参见:HBase API Filter过滤器
  8). void setCacheBlocks(boolean cacheBlocks) 设置该Get获取的数据是否缓存在内存中

复制代码
//获取指定RowKey,指定列 的最新版本数据
private static void getColumn() throws IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "users"); Get get = new Get("xiaoming".getBytes()); // Column Family and Qualifier get.addColumn("address".getBytes(), "city".getBytes()); Result result = ht.get(get); for(Cell cell : result.rawCells()){ System.out.println(new String(CellUtil.cloneRow(cell))+"\t" +new String(CellUtil.cloneFamily(cell))+"\t" +new String(CellUtil.cloneQualifier(cell))+"\t" +new String(CellUtil.cloneValue(cell))+"\t" +cell.getTimestamp()); } ht.close(); }
复制代码
复制代码
//获取指定RowKey,指定 时间戳 的数据
private static void getTimeStamp() throws IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
    HTable ht = new HTable(conf, "users");

    Get get = new Get("xiaoming".getBytes());
    
    // TimeStamp
    get.setTimeStamp(1441997498939L);
    Result result = ht.get(get);
    for(Cell cell : result.rawCells()){
        System.out.println(new String(CellUtil.cloneRow(cell))+"\t"
                +new String(CellUtil.cloneFamily(cell))+"\t"
                +new String(CellUtil.cloneQualifier(cell))+"\t"
                +new String(CellUtil.cloneValue(cell))+"\t"
                +cell.getTimestamp());
    }
    ht.close();
}
复制代码

8.获取多行Scan
Scan对象可以返回满足给定条件的多行数据。如果希望获取所有的行,直接初始化一个Scan对象即可。如果希望限制扫描的行范围,可以使用Scan对象的方法

8.1.Scan构造函数
  1). 创建扫描所有行的Scan:Scan()
  2). 创建Scan,从指定行开始扫描:Scan(byte[] startRow)
  注意:如果指定行不存在,从下一个最近的行开始
  3). 创建Scan,指定起止行:Scan(byte[] startRow, byte[] stopRow)
  注意: startRow <= 结果集 < stopRow
  4). 创建Scan,指定起始行和过滤器:Scan(byte[] startRow, Filter filter)
  注意:过滤器的功能和构造参见 http://blog.youkuaiyun.com/u010967382/article/details/37653177

8.2.Scan对象常用方法

  1. Scan setStartRow (byte[] startRow) 设置Scan的开始行,默认 结果集 包含该行。如果希望结果集不包含该行,可以在行键末尾加上0。
  2. Scan setStopRow (byte[] stopRow) 设置Scan的结束行,默认 结果集 不包含该行。如果希望结果集包含该行,可以在行键末尾加上0。
  3. Scan setBatch(int batch) 指定最多返回的Cell数目.用于防止一行中有过多的数据,导致OutofMemory错误
  4. Scan setTimeRange (long minStamp, long maxStamp) 扫描指定 时间范围 的数据
  5. Scan setTimeStamp (long timestamp) 扫描 指定时间 的数据
  6. Scan addColumn (byte[] family, byte[] qualifier) 指定扫描的列
  7. Scan addFamily (byte[] family) 指定扫描的列族
  8. Scan setFilter (Filter filter) 为Scan设置过滤器,详见HBase API Filter过滤器
  9. Scan setReversed (boolean reversed) 设置Scan的扫描顺序,默认是正向扫描(false),可以设置为逆向扫描(true)。注意:该方法0.98版本以后才可用!!
  10. Scan setMaxVersions () 获取所有版本的数据
  11. Scan setMaxVersions (int maxVersions) 设置获取的最大版本数! 不调用上下两个setMaxVersions() 方法,只返回最新版本数据
  12. void setCaching (int caching) 设定缓存在内存中的行数,缓存得越多,以后查询结果越快,同时也消耗更多内存
  13. void setRaw (boolean raw) 激活或者禁用raw模式。如果raw模式被激活,Scan将返回 所有已经被打上删除标记但尚未被真正删除 的数据。该功能仅用于激活了 KEEP_DELETED_ROWS的列族,即列族开启了hcd.setKeepDeletedCells(true)
  14. Scan激活raw模式后,只能浏览所有的列,而不能指定任意的列,否则会报错
复制代码
//扫描表中的 所有行 的最新版本数据
private static void scanAll() throws IOException,
        UnsupportedEncodingException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "users"); // Scan All Scan scan = new Scan(); ResultScanner rs = ht.getScanner(scan); for(Result result : rs){ for(Cell cell : result.rawCells()){ System.out.println(new String(CellUtil.cloneRow(cell))+"\t" +new String(CellUtil.cloneFamily(cell))+"\t" +new String(CellUtil.cloneQualifier(cell))+"\t" +new String(CellUtil.cloneValue(cell),"UTF-8")+"\t" +cell.getTimestamp()); } }
  ht.close(); }
复制代码
复制代码
//扫描指定RowKey范围,通过末尾加0,使得结果集包含StopRow
private
static void scanRange() throws IOException, UnsupportedEncodingException { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase"); conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "users"); // Range Scan scan = new Scan("xiaoming".getBytes(),"xiaoming030".getBytes()); ResultScanner rs = ht.getScanner(scan); for(Result result : rs){ for(Cell cell : result.rawCells()){ System.out.println(new String(CellUtil.cloneRow(cell))+"\t" +new String(CellUtil.cloneFamily(cell))+"\t" +new String(CellUtil.cloneQualifier(cell))+"\t" +new String(CellUtil.cloneValue(cell),"UTF-8")+"\t" +cell.getTimestamp()); } } ht.close(); }
复制代码
复制代码
//返回 所有已经被打上删除标记但尚未被真正删除 的数据
private static void scanRaw() throws IOException,
        UnsupportedEncodingException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "users"); Scan scan = new Scan();
//开启raw模式 scan.setRaw(
true);
//默认值long.Max scan.setMaxVersions(); ResultScanner rs
= ht.getScanner(scan); for(Result result : rs){ for(Cell cell : result.rawCells()){ System.out.println(new String(CellUtil.cloneRow(cell))+"\t" +new String(CellUtil.cloneFamily(cell))+"\t" +new String(CellUtil.cloneQualifier(cell))+"\t" +new String(CellUtil.cloneValue(cell),"UTF-8")+"\t" +cell.getTimestamp()); } } ht.close(); }
复制代码
复制代码
//结合过滤器,获取所有age在15到30之间的行
private static void scanFilter() throws IOException,
        UnsupportedEncodingException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://ncst:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "ncst");
HTable ht
= new HTable(conf, "users"); // And FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); // >= SingleColumnValueFilter filter1 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(), CompareOp.GREATER_OR_EQUAL, "15".getBytes()); // =< SingleColumnValueFilter filter2 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(), CompareOp.LESS_OR_EQUAL, "30".getBytes()); filterList.addFilter(filter1); filterList.addFilter(filter2); Scan scan = new Scan(); // set Filter scan.setFilter(filterList); ResultScanner rs = ht.getScanner(scan); for(Result result : rs){ for(Cell cell : result.rawCells()){ System.out.println(new String(CellUtil.cloneRow(cell))+"\t" +new String(CellUtil.cloneFamily(cell))+"\t" +new String(CellUtil.cloneQualifier(cell))+"\t" +new String(CellUtil.cloneValue(cell),"UTF-8")+"\t" +cell.getTimestamp()); } } ht.close(); }
复制代码
HbaseTemplate 操作hbase java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行 立即下载

相关推荐

hbaseTemplate

spring整合hbase使用hbaseTemplate操作hbase数据库,本项目是基于注解的形式

hbase1.x API操作

环境 jdk1.8:Linux环境和Windows环境均需要 Linux环境先安装好hbase1.x,如果还没安装hbase,请点击这里安装hbase Windows环境下安装好Maven3.3+ Windows环境下安装好IDEA或Eclipse,本文使用IDEA, 准备工作 设置idea支持lambda格式 File-->Settings-->Build-->Compiler-->Java Compiler, largest bytecode ve..

大头皮鞋的博客 682

spring与hbase整合demo

spring与hbase整合的一个小demo

Hbase Scan 用法

如题: public static void main(String[] args) throws IOException { //Scan类常用方法说明 //指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns; // scan.addFamily();

原创学无止尽 3100

hbaseTemplate:提取spring开源框架中的hbaseTemplate模板代码为一个单独的项目,该项目目前唯一支持cdh4.3.2

hbaseTemplate 提取spring开源框架中的hbaseTemplate模板代码为一个单独的项目

2d游戏地图编辑器_[U3D]基于MarchingCubes实现的War3Editor 地表/悬崖编辑器

花了几天时间研究清楚Marching cubes后,发现这个方法是一个非常适用于地图编辑,网格编辑,procedural 生成的工具。最大的优点有着较好的边缘,表面处理。然后我用U3D写了一个悬崖/地表的编辑器。其中使用到了Marching Cubes的2.5D,2D两种降维的方法。talk is cheap,让我看效果!DemoEditor展示https://www.zhihu.com/vide...

weixin_42504649的博客 1178

HBase总结(4)--数据扫描与Scan对象

一、介绍 Put、Delete与Get对象都是Row的子类,从该继承关系中我们就可以了解到Get、Delete与Pu对象本身就只能进行单行的操作,HBase客户端还提供了一套能够进行全表扫描的API,方便用户能够快速对整张表进行扫描,以获取想要的结果---scan 二、流程介绍 全表扫描是一种不需要行键值的操作,因此初始化时不需要指定行键值,因此就产生了不同的使用方法 1、不进行Scan对

wozipa的博客 1万+

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1635

Hbase 之 hbasetemplate的使用

先附上参考的文章的地址,后面再总结,归纳,已实现springcloud 操作hbase, 原文链接:https://blog.youkuaiyun.com/u010775025/article/details/80773679 心诚则灵--艾 2018-06-22 14:48:15 9144 收藏 5 分类专栏: hadoop 版权 hbasetemplate的execute, get, find 方法的使用 package com.changhong.industry.bd.cloudlogservi...

fulong0406的博客 2302

嵌入式开发必备:UART、RS232、RS485通信协议实战对比(附代码示例)

本文从嵌入式开发实战角度,深度对比了UART、RS232和RS485三种核心串行通信协议。详细解析了它们的工作原理、硬件连接、代码配置及典型应用场景,并提供了基于通信距离、节点数量和电磁环境的三维度选型指南,帮助开发者根据项目需求做出最优技术决策。

i0j1k2l3m的博客 474

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1673

HBase基础【HBase架构详解、API操作】

保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead

weixin_43923463的博客 509

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例)

本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。

weixin_30940783的博客 442

HBase基础- API操作

1、准备工作 在C:\Windows\System32\drivers\etc\hosts 中添加 Linux的ip和别名映射: ➢192.168.221.140 chust01 ➢@Before表示在任意使用@Test注解标注的public void方法执行之前执行 添加pom依赖 <dependencies> <dependency> <groupId>junit</groupId> <artifactId&g

小小鱼 307

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 380

【React】1、React入门与概览(JSX语法)

React入门 文章目录React入门一、React全家桶1. React是什么?2. 谁开发的?3. 为什么要学?4. React的特点5. 学习React之前要掌握的JavaScript基础知识二、React 概览组件JSXVirtual DOM关于虚拟DOM:Data Flow三、React基本使用相关js库四、React JSXJSX 语法规则五、模块与组件、模块化与组件化的理解5.1 模块5.2 组件5.4 模块化5.5 组件化 一、React全家桶 React基础 React-Router(R

Coding and studying 1379

基于JAVA API访问HBASE的基础操作

1、系统环境 基于HADOOP2.10.1部署的HBASE2.3.4集群 2、实现代码 package com.lineqi.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 java.io.IOExc

weixin_41561946的博客 494

echarts 饼图(加载进度条动画效果)

1、外侧动画细线效果运动“custom”自定义系列中“renderItem”属性来实现,动态修改起始角度和终止角度。2、圆环使用" pie "类型添加两个data值来画百分比圆环,动态修改data中的值。

God's asylum的博客 1631

Hbase官方API基础操作

package com.finder.hbase; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Get...

Finder的专栏 273

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HBase的基础概念及shell端命令和java api操作客户端

HBase概述 Hbase简述 Hbase是一个高可靠性的、可性能的(查询快,通过key取数据块,算法,索引,缓存),面向列的可伸缩性的分布式数据库系统。 HBase特点 1.可存储海量数据 -------借助HDFS 2.高扩展性-------存储能力、运算能力 使用廉价机器的横向扩展 3.分布式 数据库系统 解决高并发访问的问题 4.列式存储数据: 在物理存储上,hbase的数据是按照列族分开存储的K V对的字节数组,在对应的hdfs中,一张表对应一个文件夹,在对应的hd...

周星星 353

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Springboot整合HBase——大数据技术之HBase2.x

Apache HBase 是以hdfs为数据存储的,一种分布式、可扩展的noSql数据库。是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase使用与BigTable(BigTable是一个稀疏的、分布式的、持久化的多维排序map)非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可以具有疯狂变化的列。

qq_43842093的博客 4827

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HBase学习---JAVA API基础使用(1)

HBase增删改查基本API使用。 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hado

自律使我自由 257
上一篇: JavaScript模式
下一篇: Protobuf Java使用向导
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

LuckyJiang.2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值