首页 > 编程语言 >1006-HBase操作实战(JAVA API模式)

1006-HBase操作实战(JAVA API模式)

时间:2023-04-03 21:34:27浏览次数:56  
标签:JAVA String void tableName API new 1006 public append


一、准备阶段



开发环境:



hadoophadoop -2.4.0



hbasehbase -0.94.11-security



eclipse:Juno Service Release 2






二、创建 hbasedemo项目






1、通过 Eclipse 创建一个新 Java 工程



2、右击项目根目录,选择“Propertiesà> Java Build Pathà> Libraryà>  Add  External  JARs”



3、添加jar文件到 classpath



3.1 解压 HBase 安装文件



3.2 拷贝 hbase-0.94.7-security.jar、 hbase-0.94.11-security-tests.jar到工程



3.3 lib 子目录下所有的 jar 包添加到本工程的 Build Path下






三、使用HBase JAVA API






初始化和释放资源方法:
public void init() 数据初始化
public void destory()  释放资源

验证方法:
public void testCreate() 验证创建表
public void testDrop() 验证删除表
public void testPut()验证添加表数据
public void testGetByRowKey() 验证如何通过rowkey获取数据
public void testScanSToEnd() 验证范围行数据获取
public void testScanAll()  验证全表扫描

方法:
public List<Cell> get(String tableName, String rowKey)  通过rowKey插入表数据
public List<Result> scan(String tableName)  通过表名查询所有信息
public List<Result> scan(String tableName,String startRow,String stopRow) 查询范围行方法
public void create(String tableName, String[] cfs)  通过表名和列族信息创建表
public void drop(String tableName) 删除表
public void put(String tableName, List<CellBean> values) 根据提供的表和对象信息插入hbase

第一步: 封装HBase中的存储单元Cell对象

/**
 * 封装HBase中存储单元cell对象
 * @author shenfl
 * @version:V1.0
 * @Date:2015-6-8
 */
public class CellBean {

	//行健
	private String rowKey;
	//列族
	private String columnFamilly;
	//列名
	private String columnName;
	//cell值
	private String columnValue;

	public String getRowKey() {
		return rowKey;
	}

	public void setRowKey(String rowKey) {
		this.rowKey = rowKey;
	}

	public String getColumnFamilly() {
		return columnFamilly;
	}

	public void setColumnFamilly(String columnFamilly) {
		this.columnFamilly = columnFamilly;
	}

	public String getColumnName() {
		return columnName;
	}

	public void setColumnName(String columnName) {
		this.columnName = columnName;
	}

	public String getColumnValue() {
		return columnValue;
	}

	public void setColumnValue(String columnValue) {
		this.columnValue = columnValue;
	}
}


第二步: 使用HBase JAVA API 操作HBase  数据库


/**
 * 使用HBase JAVA API操作
 * 
 * @author shenfl
 *
 */
public class HBaseTest {
	Configuration config = null;
	// 创建操作表對象
	HBaseAdmin admin = null;
	// hbase的连接
	HConnection conn = null;

	@Before
	public void init() {
		config = HBaseConfiguration.create();
		// HBase只需要知道ZooKeeper,就可以操作RegionServer上的數據,设置HBase 连接ZooKeeper
		config.set("hbase.zookeeper.quorum", "192.168.2.35:2181,192.168.2.36:2181,192.168.2.37:2181");
		try {
			conn = HConnectionManager.createConnection(config);
			admin = new HBaseAdmin(config);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@After
	public void destory() {
		try {
			admin.close();
			conn.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testCreate() {
		String tableName = "account";
		String[] columnFamilies = new String[] { "info", "other" };
		create(tableName, columnFamilies);
	}

	//@Test
	public void testDrop() {
		drop("account");
	}

	@Test
	public void testPut() {

		// 设置表对象列表
		List<CellBean> cbList = new ArrayList<CellBean>();
		// 设置表名account
		String tableName = "account";
		CellBean e = null;
		for(int i=0;i<3;i++){
			e = new CellBean();
			e.setRowKey("g20142500"+i);
			e.setColumnFamilly("info");
			e.setColumnName("username");
			e.setColumnValue("shenfl"+i);
			cbList.add(e);
			e = new CellBean();
			e.setRowKey("g20142500"+i);
			e.setColumnFamilly("other");
			e.setColumnName("career");
			e.setColumnValue("singer"+i);
			cbList.add(e);
		}
		put(tableName, cbList);
	}

	@Test
	public void testGetByRowKey() {
		
		String tableName = "account";
		String rowKey = "g201425001";
		List<Cell> cells = get(tableName, rowKey);
		StringBuffer info = new StringBuffer();
		for (Cell c : cells) {
			//使用CellUtil方法输出对应列, hbase0.96 版本使用CellUtil函数
			info.append(new String(CellUtil.cloneFamily(c))).append(":")
				.append(new String(CellUtil.cloneQualifier(c))).append("\t")
				.append(new String(CellUtil.cloneValue(c))).append("\n");
		}
		System.out.println(info);
	}
	@Test
	public void testScanSToEnd(){
		
		StringBuffer sb = new StringBuffer();
		String tableName = "account";
		String startRow = "g201425000";
		String stopRow = "g201425002";
		List<Result> rsList = scan(tableName, startRow, stopRow);
		byte[] rowKey = null;
		byte[] username = null;
		byte[] career = null;
		for(Result rs:rsList){
			rowKey = rs.getRow();
			username = rs.getValue(Bytes.toBytes("info"), Bytes.toBytes("username"));
			career = rs.getValue(Bytes.toBytes("other"), Bytes.toBytes("career"));
			sb.append(new String(rowKey)).append("\t")
			  .append(new String(username)).append("\t")
			  .append(new String(career)).append("\n");
		}
		System.out.println(sb.toString());
	}
	
	@Test
	public void testScanAll() {
		StringBuffer sb = new StringBuffer();
		List<Result> rsList = scan("account");
		for (Result rs : rsList) {

			List<Cell> listCells = rs.listCells();
			for (Cell c : listCells) {
				// 使用CellUtil方法输出对应列, hbase0.96 版本使用CellUtil函数
				sb.append(new String(CellUtil.cloneRow(c))).append("\t")
				  .append(new String(CellUtil.cloneFamily(c))).append(":")
				  .append(new String(CellUtil.cloneQualifier(c))).append("\t")
				  .append(new String(CellUtil.cloneValue(c))).append("\n");
			}
		}

		System.out.println(sb);
	}
	/**
	 * 通过rowKey插入表数据
	 * @param tableName 表名
	 * @param rowKey	行健
	 * @return
	 */
	public List<Cell> get(String tableName, String rowKey) {
		HTableInterface table = null;
		Get get = null;
		Result rs = null;
		List<Cell> listCells = new ArrayList<Cell>();
		try {
			table = conn.getTable(tableName);
			get = new Get(Bytes.toBytes(rowKey));
			rs = table.get(get);
			listCells = rs.listCells(); 
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				table.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return  listCells;
	}
	
	/**
	 * 查询所有行
	 * 
	 * @param tableName
	 * @return
	 */
	public List<Result> scan(String tableName) {
		HTableInterface table = null;
		List<Result> rsList = new ArrayList<Result>();
		try {
			table = conn.getTable(tableName);
			Scan scan = new Scan();
			ResultScanner scanner = table.getScanner(scan);
			Iterator<Result> iterator = scanner.iterator();
			Result rs = null;
			while (iterator.hasNext()) {
				rs = (Result) iterator.next();
				rsList.add(rs);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				table.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return rsList;
	}
	/**
	 * 查询范围行
	 * @param tableName 表名
	 * @param startRow  开始的行健
	 * @param stopRow   结束行健
	 * @return
	 */
	public List<Result> scan(String tableName,String startRow,String stopRow) {
		
		HTableInterface table = null;
		List<Result> rsList = new ArrayList<Result>();
		try {
			table = conn.getTable(tableName);
			Scan scan = new Scan();
			scan.setStartRow(Bytes.toBytes(startRow));
			scan.setStopRow(Bytes.toBytes(stopRow));
			ResultScanner rs = table.getScanner(scan);
			
			for(Result v:rs){
				rsList.add(v);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				table.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return  rsList;
	}
	/**
	 * 创建壁报
	 * 
	 * @param tableName
	 *            表名
	 * @param cfs
	 *            列族
	 */
	public void create(String tableName, String[] cfs) {

		if (cfs == null || cfs.length == 0) {
			return;
		}
		try {
			// 校验表是否存储
			if (admin.tableExists(tableName)) {
				return;
			}
			// 创建表
			HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
			// 创建列族
			for (String cf : cfs) {
				desc.addFamily(new HColumnDescriptor(cf));
			}
			// 创建表
			admin.createTable(desc);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 删除表
	 * 
	 * @param tableName
	 *            表名
	 */
	public void drop(String tableName) {
		try {
			if(admin.tableExists(tableName)){
				
				admin.disableTable(tableName);
				admin.deleteTable(tableName);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 向指定表插入数据
	 * 
	 * @param tableName
	 *            表名
	 * @param values
	 *            数据
	 */
	public void put(String tableName, List<CellBean> values) {

		if (StringUtils.isBlank(tableName) || values == null || values.size() == 0) {
			return;
		}
		Put put = null;
		HTableInterface table = null;
		try {
			table = conn.getTable(tableName);
			for (CellBean v : values) {
				put = new Put(Bytes.toBytes(v.getRowKey()));
				put.add(Bytes.toBytes(v.getColumnFamilly()), Bytes.toBytes(v.getColumnName()),
						Bytes.toBytes(v.getColumnValue()));
				table.put(put);
			}
		} catch (Exception e) {
			// 实际生产环境要通过记录日志,例如: logger.warn("xxxxx",e);
			e.printStackTrace();
		}finally{
			try {
				table.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}




参考文章:



1、HBase连接池 -- HTablePool被Deprecated之后


2、HBase Java API 介绍


3、HBase Java API 操作案例

http://www.programcreek.com/java-api-examples/index.php?api=org.apache.hadoop.hbase.HTableDescriptor

http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Admin.html

标签:JAVA,String,void,tableName,API,new,1006,public,append
From: https://blog.51cto.com/u_14361901/6167564

相关文章

  • AppMobi即将开源所有HTML5 API
    据国外媒体报道,HTML5开发公司AppMobi将于黑色星期五(11月25日)开源其所有HTML5设备端API。AppMobi正在致力于推动HTML5的发展,并希望通过HTML5影响整个互联网生态系统。AppMobi的HTML5不仅涉及台式电脑,还包括移动设备,曾开发过很多可访问摄像头、加速计和GPS等本地功能的HTML5......
  • 如何使用Java程序实现二叉数
    二叉树是一种重要的数据结构,它由一组节点组成,每个节点可以拥有最多两个子节点。使用Java可以很容易地实现一个二叉树。下面将介绍如何使用Java实现二叉树。二叉树的节点定义一个二叉树的节点可以定义为一个类,其中至少需要包含以下属性:节点值左子节点右子节点在Java中,我们......
  • Java多线程
    1.可见性、原子性和有序性问题多线程有三大特性,分别是可见性、原子性和有序性。1.1可见性  在单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存的数据一致性容易解决。因为所有线程都是操作同一个CPU的缓存,一个线程对缓存的写,对另外一个线程来说一定是可见的。一个线程......
  • 实验一-密码引擎-3-加密API研究
    实验一-密码引擎-3-加密API研究密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用......
  • Java判断文件夹、文件是否存在,不存在则新建
    Java判断文件夹、文件是否存在,不存在则新建原文链接:https://blog.csdn.net/asfsdgdfgdf/article/details/1283162781、Java判断是否存在文件夹,不存在则新建Filefile=newFile("D:/test/filetest/test.txt");if(!file.getParentFile().exists()){file.getParentFile().......
  • Java 获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、new Thr
    Java获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、newThrowable().getStackTrace())原文链接:https://blog.csdn.net/inthat/article/details/111885544文章目录一、Java获取当前类名和方法名Thread.currentThread().getStackTrace()1.关于Thr......
  • 2-Java基础语法
    1.注释注释是对代码的解释和说明文字。Java中的注释分为三种:单行注释://这是单行注释文字多行注释:/_这是多行注释文字这是多行注释文字这是多行注释文字_/注意:多行注释不能嵌套使用。文档注释(暂时用不到):/*_这是多行注释文字这是多行注释文字这是多......
  • 如何用Java程序生成大乐透号码?
    在大乐透游戏中,需要选出5个红球号码和2个蓝球号码。这个过程可能比较耗时,而且如果想要生成多组号码,手动输入的方式就变得特别不切实际。因此,我们可以使用Java程序来实现大乐透号码的自动生成。一、生成红球号码首先,需要确定生成红球号码的范围和数量。在大乐透游戏中,红球号码的......
  • 密码引擎API研究
    密码引擎API研究标准文档CryptoAPICryptographyCryptoAPISystemArchitectureCryptographicProviderTypeswincrypt.hheaderMicrosoftCryptographicServiceProvidersPKCS#11PKCS#11GM/T0016-2012智能密码钥匙密码应用接口规范GM/T0018-2012密码设......
  • 关闭Java时后台的FM无法恢复
    在MVM的版本中,先启动任何本地播放音乐的应用FM/Audioplayer,此时同时启动多个没有音乐的Java应用,并关闭某一个Java应用,之前后台的FM等无法重新恢复播放。例如: 1、启动FM->启动Java应用A,FM停止播放->后台A->FM恢复->启动Java应用B,FM停止播放->后台......