`
qindongliang1922
  • 浏览: 2183220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117507
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125902
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59878
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71283
社区版块
存档分类
最新评论

如何使用Java API读写Hbase

阅读更多
Hbase是够建在HDFS之上的半结构化的分布式存储系统,具有HDFS的所有优点,同时也有自己的亮点,支持更快速的随机读写以及更灵活的Scan操作,而在HDFS上这一点我们是远远做不到的,因为HDFS仅支持Append追加操作,而且也不具备随机读写一条数据的功能,实际上HDFS扫描的范围按Block来算的,所以从某个角度来言,Hbase利用Schemal的方式做到了这一点。

一般情况下,我们使用Linux的shell命令,就可以非常轻松的操作Hbase,例如一些建表,建列簇,插值,显示所有表,统计数量等等,但有时为了提高灵活性,我们也需要使用编程语言来操作Hbase,当然Hbase通过Thrift接口提供了对大多数主流编程语言的支持,例如C++,PHP,Python,Ruby等等,那么本篇,散仙给出的例子是基于Java原生的API操作Hbase,相比其他的一些编程语言,使用Java操作Hbase,会更加高效一些,因为Hbase本身就是使用Java语言编写的。

下面,散仙给出源码,以供参考:

package com.hbase;

import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

/**
 * @author 三劫散仙
 * 
 * **/
public class Test {
	
	static Configuration conf=null;
	static{
		
		  conf=HBaseConfiguration.create();//hbase的配置信息
		  conf.set("hbase.zookeeper.quorum", "10.2.143.5");  //zookeeper的地址
		
	}
	
	public static void main(String[] args)throws Exception {
		
		Test t=new Test();
		//t.createTable("temp", new String[]{"name","age"});
	 //t.insertRow("temp", "2", "age", "myage", "100");
	// t.getOneDataByRowKey("temp", "2");
		t.showAll("temp");
	 
	}
	
	/***
	 * 创建一张表
	 * 并指定列簇
	 * */
	public void createTable(String tableName,String cols[])throws Exception{
	 HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类
	if(admin.tableExists(tableName)){
		System.out.println("此表已经存在.......");
	}else{
		HTableDescriptor table=new HTableDescriptor(tableName);
		for(String c:cols){
			HColumnDescriptor col=new HColumnDescriptor(c);//列簇名
			table.addFamily(col);//添加到此表中
		}
		
	 admin.createTable(table);//创建一个表
	 admin.close();
	 System.out.println("创建表成功!");
	}
	}
	
	/**
	 * 添加数据,
	 * 建议使用批量添加
	 * @param tableName 表名
	 * @param row  行号
	 * @param columnFamily 列簇
	 * @param column   列
	 * @param value   具体的值
	 * 
	 * **/
    public  void insertRow(String tableName, String row,  
            String columnFamily, String column, String value) throws Exception {  
        HTable table = new HTable(conf, tableName);  
        Put put = new Put(Bytes.toBytes(row));  
        // 参数出分别:列族、列、值  
        put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),  
                Bytes.toBytes(value)); 
       
        table.put(put);  
        table.close();//关闭
        System.out.println("插入一条数据成功!");
    }    
    
    /**
     * 删除一条数据
     * @param tableName 表名
     * @param row  rowkey
     * **/
    public void deleteByRow(String tableName,String rowkey)throws Exception{
    	HTable h=new HTable(conf, tableName);
    	Delete d=new Delete(Bytes.toBytes(rowkey));
    	h.delete(d);//删除一条数据
    	h.close();
    }
    
    /**
     * 删除多条数据
     * @param tableName 表名
     * @param row  rowkey
     * **/
    public void deleteByRow(String tableName,String rowkey[])throws Exception{
    	HTable h=new HTable(conf, tableName);
     
    	List<Delete> list=new ArrayList<Delete>();
    	for(String k:rowkey){
    		Delete d=new Delete(Bytes.toBytes(k));
    		list.add(d);
    	}
    	h.delete(list);//删除
    	h.close();//释放资源
    }
    
    /**
     * 得到一条数据
     * 
     * @param tableName 表名
     * @param rowkey 行号
     * ***/
    public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{
    	HTable h=new HTable(conf, tableName);
    	
    	Get g=new Get(Bytes.toBytes(rowkey));
    	Result r=h.get(g);
    	for(KeyValue k:r.raw()){
    		
    		System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));
    		System.out.println("时间戳:  "+k.getTimestamp());
    		System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));
    		System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));
    		//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
    		//	System.out.println("值:  "+Bytes.toInt(k.getValue()));
    		//}else{
    		String ss=	Bytes.toString(k.getValue());
    		System.out.println("值:  "+ss);
    		//}
    		
    		 
    		
    	}
    	h.close();
    	
    	
    }
    
    /**
     * 扫描所有数据或特定数据
     * @param tableName
     * **/
    public void showAll(String tableName)throws Exception{
    	
HTable h=new HTable(conf, tableName);
    	
    	 Scan scan=new Scan();
    	 //扫描特定区间
    	 //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));
    	 ResultScanner scanner=h.getScanner(scan);
    	 for(Result r:scanner){
    		 System.out.println("==================================");
    	for(KeyValue k:r.raw()){
    		
    		System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));
    		System.out.println("时间戳:  "+k.getTimestamp());
    		System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));
    		System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));
    		//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
    		//	System.out.println("值:  "+Bytes.toInt(k.getValue()));
    		//}else{
    		String ss=	Bytes.toString(k.getValue());
    		System.out.println("值:  "+ss);
    		//}
    		
    		 
    		
    	}
    	 }
    	h.close();
    	
    }

}

显示所有数据的打印输出如下:
==================================
行号:  1
时间戳:  1385597699287
列簇:  name
列:  myname
值:  秦东亮
==================================
行号:  2
时间戳:  1385598393306
列簇:  age
列:  myage
值:  100
行号:  2
时间戳:  1385597723900
列簇:  name
列:  myname
值:  三劫散仙



由此,可以看出Hbase的对外的API提供接口,是非常简单易用的。
2
0
分享到:
评论

相关推荐

    Java API读写Hbase演示项目.zip

    Java API 用于读写 HBase 是 Java 开发者在大数据领域中常见的操作,尤其是在处理海量分布式数据时。HBase 是一个非关系型数据库(NoSQL),基于 Google 的 Bigtable 模型,设计用于大规模分布式环境,是 Apache ...

    如何使用Java API操作Hbase(基于0.96新的api)

    本篇文章将深入探讨如何使用Java API与HBase进行交互。 首先,我们需要了解HBase的主要组件: 1. **表(Table)**:HBase中的数据存储在表中,表由行和列族组成。 2. **行(Row)**:行由行键(Row Key)唯一标识...

    java api 访问hbase demo(Maven)

    在Java API中访问HBase是大数据处理中常见的一项任务,HBase作为一个分布式、列式存储的NoSQL数据库,常用于海量数据的实时读写。在这个Java API访问HBase的Maven项目中,我们将探讨如何配置项目,引入依赖,以及...

    Hadoop+HBase+Java API

    **Java API** 是Java编程语言提供的应用程序接口,允许开发者使用Java来访问和操作Hadoop和HBase的功能。对于Hadoop,Java API主要包括`org.apache.hadoop.mapreduce`包下的类,如Job、Mapper、Reducer等,用于实现...

    javaApi_sparkhiveAPI_hbaseAPI.zip

    本压缩包"javaApi_sparkhiveAPI_hbaseAPI.zip"包含了2019年8月至10月期间针对这些技术的Java版API实现,以及与Spark相关的Hive和HBase API。以下是关于这些技术的详细知识: 1. **Java API for Hive**: - **Hive*...

    java代码使用thrift2操作hbase示例

    在本文中,我们将深入探讨如何使用Java通过Thrift2接口操作HBase数据库。HBase是一个分布式、可扩展的大数据存储系统,它构建于Hadoop之上,支持实时读写。Thrift是一个轻量级的框架,用于跨语言服务开发,允许不同...

    Hbase Java API

    HBase Java API HBase 是 Hadoop 的数据库,能够对大数据提供随机、实时读写访问。他是开源的,分布式的,多版本的,面向列的,存储模型。HBase 的整体结构主要包括 HBase Master、HRegion 服务器和 HRegion Server...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java中操作HBase,我们需要使用HBase的Java客户端API。首先,确保引入了所有必要的jar包,这些包通常包括hbase-client、hbase-common、hadoop-client等。这些依赖可以使用Maven或Gradle等构建工具管理,或者直接在...

    hbase的java client实例

    本主题将深入探讨如何使用Java客户端API与HBase进行交互,包括集成Spring、MapReduce实例以及协处理器的使用。 首先,让我们从HBase的基础开始。HBase是构建在Hadoop文件系统(HDFS)之上的开源NoSQL数据库,它为非...

    hbase常用JAVA API

    在Java中,我们可以使用HBase的Java API来与HBase交互,进行数据的读写操作。下面将详细介绍HBase Java API的核心概念和常用方法。 1. **连接HBase** 要连接到HBase,你需要创建一个`Configuration`对象,然后通过...

    hbase资料api

    HBase数据查询API HBase是一种分布式的、面向列的NoSQL数据库,主要应用于存储大量的半结构化数据。HBase提供了多种查询方式,包括单条查询和批量查询。 单条查询 单条查询是通过rowkey在table中查询某一行的数据...

    java解决hive快速导数据到Hbase代码

    本文将详细讨论如何使用Java编程语言实现从Hive到HBase的快速数据导入方案。 首先,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,适合大规模数据的离线...

    hbase访问方式之javaapi共3页.pdf.zip

    优化HBase Java API的使用,可以考虑以下几点:批量操作、使用BufferedMutator、调整缓存设置、选择合适的分区策略等。 总结,HBase的Java API是开发人员与HBase进行交互的主要工具,通过理解和熟练运用这些API,...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    对HBase的API做了一层抽象,统一了HBase1.x和HBase2.x的实现,并提供了读写HBase的ORM的支持,同时,sdk还对HBase thrift 的客户端API进行了池化封装,(类似JedisPool),消除了直接使用原生API的各种问题,使之...

    封装hbase以便java调用

    Apache HBase提供了Java API供开发者使用,包括HBase客户端库,允许开发者通过Java代码来创建表、插入数据、查询数据以及执行其他操作。例如,`HTable`类用于与特定的表进行交互,`Put`和`Get`对象分别用于写入和...

    java 通过thrift-0.9.1读取hbase表数据

    然而,由于HBase的原生API是用Java编写的,对于非Java语言如Python、C++等,直接使用会比较复杂。这时,Apache Thrift就派上用场了。 Thrift是一个接口定义语言和跨语言的通信框架,它可以生成多种编程语言的代码,...

    java开发hbase-1.2.1所需的jar包

    以下是关于使用Java开发HBase 1.2.1时所需的一些关键知识点: 1. **HBase依赖**: 开发HBase应用程序时,首先需要在项目中引入HBase的客户端库。HBase 1.2.1的jar包通常包括`hbase-client.jar`,它包含了与HBase通信...

    Hbase Java API详解.pdf

    在HBase Java API使用方面,HBaseConfiguration对象是每个HBase客户端都需要使用的,它代表了HBase的配置信息。可以通过默认构造函数来创建HBaseConfiguration对象,它会尝试从类路径中的hbase-default.xml和hbase-...

    hbase 完全使用手册

    在使用 HBase 时,用户需要熟悉 HBase Shell 命令行工具或者 HBase 提供的 Java API 来进行数据的读写操作。HBase Shell 提供了一个交互式的界面,允许用户执行数据操作、管理表结构、以及维护集群状态等。Java API ...

Global site tag (gtag.js) - Google Analytics