Week09_day05(Java API操作Hbase)
package com.wyh.HbaseAPI; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class Demo1Junit { //定义成员变量,保证每个test都可以访问到
private Configuration conf;
private HConnection conn;
private HBaseAdmin hAdmin; /**
*
* 建立与Hbase的连接,设置成before,使下面的Test执行之前都先执行这个
*/
@Before
public void connect(){
try {
//获取Configuration,读取Hadoop的配置文件
conf = new Configuration(); //获取zookeeper的配置
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
//获取连接,可以通过这个连接获取到表
conn = HConnectionManager.createConnection(conf); //获取到HMaster,因为HMaster是对表进行DDL操作的
hAdmin = new HBaseAdmin(conf); System.out.println("建立连接成功。。。"+conn);
} catch (IOException e) {
e.printStackTrace();
}
} /**
*
* 在Hbase中创建表
*/
@Test
public void createTable(){
try {
//使用HTableDescriptor对象创建一个表对象
HTableDescriptor students = new HTableDescriptor("students"); //使用HColumnDescriptor对象创建一个列簇
HColumnDescriptor info = new HColumnDescriptor("info");
String name = Bytes.toString(students.getName()); //将列簇加入到表中
students.addFamily(info);
System.out.println(name+"表 创建成功。。"); //使用HMaster对象来创建该表
hAdmin.createTable(students);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 删除Hbase中的表,在Hbase中并没有真正将表进行删除,内部是将其打上一个标记,上查询不到,HMaster定时清理过期文件
*/
@Test
public void deleteTable(){
try {
//使用HMaster对象来读表进行操作 //判断是否有该表存在
if(hAdmin.tableExists("student")){ //在删除表之前,必须将其表设置成不可用,否则报错
hAdmin.disableTable("student"); //调用delete方法删除表
hAdmin.deleteTable("student"); //友情提示
System.out.println(conn.getTable("student").getName()+"表 成功被删除。。"); } } catch (IOException e) {
e.printStackTrace();
}
} /**
* 往创建的表中插入一条数据
*/
@Test
public void putData(){
try {
//获取到表的实例
HTableInterface student = conn.getTable("student"); //创建Put实例,给一个行键
Put put = new Put("001".getBytes()); //将这个行键的值,添加列簇,列名,具体的值
put.add("info".getBytes(),"name".getBytes(),"zhangsan".getBytes()); //调用put方法添加一行数据
student.put(put); System.out.println(student.getName()+"表 成功插入数据。。"); } catch (IOException e) {
e.printStackTrace();
}
} /**
* get方法获取到表的数据
*/
@Test
public void getData(){
try {
//获取到表的实例
HTableInterface student = conn.getTable("student"); //获取get实例 添加指定的rowkey
Get get = new Get("001".getBytes()); //获取到行键信息
String rowkey = Bytes.toString(get.getRow()); //调用get方法,返回一个结果集
Result result = student.get(get);
//调用getValue()方法获取到一个字节数组的一个结果集,再利用Bytes工具类的toString()方法去将其转换成字符串
String s = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes())); //输出
System.out.println(rowkey+"\t"+s);
System.out.println("查询结束。。。"); } catch (IOException e) {
e.printStackTrace();
} } /**
* 一次性插入多条数据
*/
@Test
public void putAll(){
//创建一个ArrayList存Put
ArrayList<Put> puts = new ArrayList<Put>(); try {
//获取表实例
HTableInterface students = conn.getTable("students"); //读取数据
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\students.txt"));
String line;
while ((line = br.readLine())!=null){
String[] split = line.split(",");
String id = split[0];
String name = split[1];
String age = split[2];
String gender = split[3];
String clazz = split[4]; //为每一行数据根据行键创建一个新的Put
Put put = new Put(id.getBytes()); //插入每一列
put.add("info".getBytes(),"name".getBytes(),name.getBytes());
put.add("info".getBytes(),"age".getBytes(),age.getBytes());
put.add("info".getBytes(),"gender".getBytes(),gender.getBytes());
put.add("info".getBytes(),"clazz".getBytes(),clazz.getBytes()); //将这个put对象加入到集合中去
puts.add(put);
} //使用put(List<Put> list)方法添加数据
students.put(puts); System.out.println("students.txt 数据插入完毕。。。");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 查询结果,两种方法进行查询
*/
@Test
public void getdata(){
try {
//获取到表的实例
HTableInterface students = conn.getTable("students"); //创建一个Get实例 穿一个行键
Get get = new Get("1500100014".getBytes());
String id = Bytes.toString(get.getRow()); //获取结果集
Result result = students.get(get); /**
* 查询方法一:已经知道列的数量和列名
*/
String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes())); System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+clazz); /**
* 查询方法二:不知道列的数量和列名
* @deprecated as of 0.96, use {@link CellUtil#cloneValue(Cell)}
*/ List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String s = Bytes.toString(CellUtil.cloneValue(cell));
System.out.print(s);
System.out.print("\t");
} } catch (IOException e) {
e.printStackTrace();
}
} /**
* scan 查询多条数据
*
*/
@Test
public void scanAll(){
try {
//获取表的实例
HTableInterface students = conn.getTable("students"); //创建scan实例
Scan scan = new Scan(); //定义查询的范围 含头不含尾
scan.setStartRow("1500100014".getBytes());
scan.setStopRow("1500100085".getBytes()); //将设置好的scan加入进去,返回一个结果的迭代器
ResultScanner scanner = students.getScanner(scan); //因为next()指向的是下一个索引,所以我们类似读取数据的做法去遍历取值
Result result;
while ((result=scanner.next())!=null){ //调用之前写好的方法
print(result);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
*
*
* scan扫描查询有需求的数据,比较器和过滤器
*
* 通过运用4种比较器,过滤出姓于,年纪大于23岁,性别为女,且是理科的学生。
*
* 正则比较器 RegexStringComparator
* 包含比较器 SubstringComparator
* 二进制前缀比较器 BinaryPrefixComparator
* 二进制比较器 BinaryComparator
*
*/
@Test
public void FilterData(){
try {
//获取表的实例
HTableInterface students = conn.getTable("students"); /**
* 第一个过滤器,过滤出班级是理科开头的
*/
//创建比较器 正则比较器 RegexStringComparator
RegexStringComparator regexStringComparator = new RegexStringComparator("理科."); //创建过滤器 列过滤器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),
CompareFilter.CompareOp.EQUAL,regexStringComparator); /**
* 第二个过滤器,过滤出性别是女生的
*/
//创建比较器 包含比较器 SubStringComparator
SubstringComparator gender = new SubstringComparator("女"); //创建过滤器 列过滤器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "gender".getBytes(),
CompareFilter.CompareOp.EQUAL, gender); /**
* 第三个过滤器,过滤出年纪大于23岁的
*/
//创建比较器 二进制比较器 BinaryComparator
BinaryComparator binaryComparator = new BinaryComparator("23".getBytes()); //创建过滤器 列过滤器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(),
CompareFilter.CompareOp.GREATER_OR_EQUAL, binaryComparator); /**
* 第四个过滤器,过滤出姓于的
*/
//创建比较器 二进制前缀比较器 BinaryPrefixComparator
BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("于".getBytes()); //创建过滤器 列过滤器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter("info".getBytes(), "name".getBytes(),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator); //要想实现多个需求,就添加多个过滤条件
//创建一个过滤器列表,可以添加多个过滤器
FilterList filterList = new FilterList();
filterList.addFilter(singleColumnValueFilter);
filterList.addFilter(singleColumnValueFilter1);
filterList.addFilter(singleColumnValueFilter2);
filterList.addFilter(singleColumnValueFilter3); //创建scan实例
Scan scan = new Scan(); //将过滤器添加进去
scan.setFilter(filterList); //通过表的实例获取结果迭代器
ResultScanner scanner = students.getScanner(scan); Result result = null;
while ((result = scanner.next())!=null){
print(result);
}
} catch (IOException e) {
e.printStackTrace();
} } /**
* 行键过滤器 RowFilter 使用 startRow/stopRow 方式比较好
*
*/
@Test
public void rowFilter(){
try {
//获取表的实例
HTableInterface students = conn.getTable("students"); /**
* 使用行键比较器,过滤出学号是以15001001开头的学生 过滤的对象是rowkey
*/
//创建filter实例
//创建比较器 使用二进制前缀比较器 BinaryPrefixComparator
BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("15001001".getBytes()); //创建过滤器 行键比较器 RowFilter()
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator); /**
* 使用二进制前缀比较器过滤出文科的
*/
//创建比较器 二进制前缀比较器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("文科".getBytes()); //创建过滤器
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), "clazz".getBytes(),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //创建一个过滤器集合
FilterList filterList = new FilterList();
filterList.addFilter(rowFilter);
filterList.addFilter(singleColumnValueFilter); //创建scan实例
Scan scan = new Scan();
scan.setFilter(filterList); ResultScanner scanner = students.getScanner(scan);
Result result = null;
while ((result=scanner.next())!=null){
print(result);
} } catch (IOException e) {
e.printStackTrace();
} } /**
* 关闭连接
*/
@After
public void close(){
if(conn!=null){
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
} System.out.println("conn连接已经关闭。。");
} if(hAdmin!=null){
try {
hAdmin.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("hAdmin已经关闭。。"); }
} /**
* 编写一个方法,实现调用实现显示查询结果
*/
public static void print(Result result){
String id = Bytes.toString(result.getRow());
String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes()));
System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+clazz);
} }
Week09_day05(Java API操作Hbase)的更多相关文章
- HBase 6、用Phoenix Java api操作HBase
开发环境准备:eclipse3.5.jdk1.7.window8.hadoop2.2.0.hbase0.98.0.2.phoenix4.3.0 1.从集群拷贝以下文件:core-site.xml.hb ...
- linux 下通过过 hbase 的Java api 操作hbase
hbase版本:0.98.5 hadoop版本:1.2.1 使用自带的zk 本文的内容是在集群中创建java项目调用api来操作hbase,主要涉及对hbase的创建表格,删除表格,插入数据,删除数据 ...
- Java API 操作HBase Shell
HBase Shell API 操作 创建工程 本实验的环境实在ubuntu18.04下完成,首先在改虚拟机中安装开发工具eclipse. 然后创建Java项目名字叫hbase-test 配置运行环境 ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- 【Hbase三】Java,python操作Hbase
Java,python操作Hbase 操作Hbase python操作Hbase 安装Thrift之前所需准备 安装Thrift 产生针对Python的Hbase的API 启动Thrift服务 执行p ...
- java api操作
java api操作 导入开发包 将hbase安装包中lib下包导入java项目 创建表 Configuration conf = HBaseConfiguration.create(); c ...
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- 使用Java API操作HDFS文件系统
使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- Hadoop之HDFS(三)HDFS的JAVA API操作
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
随机推荐
- 该怎么解决no route to host
出现No route to host 的时候,有如下几种可能: 1.对方的域名确实不通 2.本机自己开了防火墙 3.本机的etc/hosts 里面没有配置本机的机器名和ip (可能性最大) 其中第三点 ...
- Github绝版开源加速神器fastgit下载链接
Github绝版开源加速神器fastgit下载链接: https://pan.baidu.com/s/1R-4rWuxh0_awIRaWCiGWkQ 提取码: yyrg 参考链接:发现一款稳定可靠的 ...
- 即时通讯技术文集(第35期):IM群聊技术合集(Part2) [共12篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第35 期. [- 1 -] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术 ...
- 意外之喜——黑夜 CrossFire!!!
在日常逛L站时,偶然发现了"友链"功能,机缘巧合下进入了specialhua的博客,又被吸引着点进了其中一篇博客,于是便通过specialhua的博客看到了黑夜的这篇文章,感觉就像 ...
- macOS安装编译pcl
macOS安装编译pcl git clone git@github.com:PointCloudLibrary/pcl.git cd pcl brew install eigen brew insta ...
- KES的执行计划分析与索引优化
今天我们继续探讨国产数据库KES的相关内容,本次的讨论重点将放在SQL优化的细节上.作为Java开发人员,我们通常并不需要深入了解数据库的底层实现细节,而是更多地关注如何提升应用性能与数据库的交互效率 ...
- 一种调试 线段树 / Treap / Splay / 左偏树 / LCT 等树形结构的技巧
前言 如果我们需要观察程序运行过程中,某一个变量.某一个序列的变化情况,你可以在修改的地方打断点 debug,或者直接在需要的地方输出就行了. 但是对于一些树形结构,我们不好将其直观地呈现出来,常常只 ...
- Ellyn-Golang调用级覆盖率&方法调用链插桩采集方案
词语解释 Ellyn要解决什么问题? 在应用程序并行执行的情况下,精确获取单个用例.流量.单元测试走过的方法链(有向图).出入参数.行覆盖等运行时数据,经过一定的加工之后,应用在覆盖率.影响面评估.流 ...
- JAVA多线程和并发性知识点总结
一. 什么是进程.线程?线程和进程的区别?1. 进程当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中的程序.进程是操作系统进行资源分配和调度的一个独立单位.进程的三个特征: 独立性独立存 ...
- Storm基本概念
storm简介 场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝 ...