--用java操作hbase

1、配置jar包环境

创建hbase项目 --> 新建folder文件夹 --> 将hbase相关jar包全部导入到java项目之中 --> add buildpath -->导入hbase conf文件夹下面的配置文件 (配置hbase环境时修改过的所有配置文件)-->

将配置文件放到hbase的src目录下面 (目的:让java找到hbase)-->导入hadoop相关jar包

2、查看hbase方法api的方法:在hbase源码安装包中的docs文件夹下apidocs

3、hbase基本操作源码

package com.wcg.Hbase;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import org.apache.hadoop.classification.InterfaceAudience.Private;
import org.apache.hadoop.classification.InterfaceAudience.Public;
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.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
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.RetriesExhaustedWithDetailsException;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.generated.master.table_jsp;
import org.apache.hadoop.hbase.thrift.generated.Hbase.Processor.get;
import org.apache.hadoop.hbase.thrift2.generated.TMutation;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetDataEncryptionKeyRequestProto;
import org.apache.hadoop.io.Stringifier;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.exceptions.verification.NeverWantedButInvoked; import com.google.common.collect.Table;
import com.wcg.Hbase.Phone.PhoneDetail;
import com.wcg.Hbase.Phone.dayPhoneDetail; public class HbaseDemo { Configuration conf = null;
HBaseAdmin admin = null;
private String TM = "phone";
HTable table = null; @Before
public void init() throws MasterNotRunningException, ZooKeeperConnectionException, IOException{
//首先进行初始化
conf = new Configuration();
//连接zookeeper
conf.set("hbase.zookeeper.quorum", "node1,node2,node3");
admin = new HBaseAdmin(conf);
table = new HTable(conf, TM); } @Test
public void createTable() throws IOException{
//在创建表之前先进行判断该表是否已经存在
if(admin.tableExists(TM)){
admin.disableTable(TM);
admin.deleteTable(TM); } //创建一个表描述的类
HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TM));
HColumnDescriptor family = new HColumnDescriptor("cf".getBytes());
desc.addFamily(family);
admin.createTable(desc); } //向表中插入数据
@Test
public void insertDB() throws RetriesExhaustedWithDetailsException, InterruptedIOException{
String rowkey = "111111"; Put put = new Put(rowkey.getBytes()); put.add("cf".getBytes(), "name".getBytes(), "zhangsan".getBytes()); table.put(put); } /**
* 模拟手机通话记录
* 一共有10个用户,每个用户产生了1000条数据
* @throws ParseException
* @throws InterruptedIOException
* @throws RetriesExhaustedWithDetailsException
* @throws IOException
*/
@Test
public void insertDB2() throws ParseException, RetriesExhaustedWithDetailsException, InterruptedIOException{
List<Put> list = new ArrayList<Put>();
for(int i=0;i<5;i++){
String phoneNum = getPhone("158");
for(int j= 0; j<1000;j++){
//产生一些其他类型的数据
String dnum = getPhone("182");
String length = r.nextInt(99)+"";
String type = r.nextInt(2)+"";
String date = getDate("2019");
//随机产生一个rowkey
String rowkey = phoneNum+"_"+(Long.MAX_VALUE-sdf.parse(date).getTime());
Put put = new Put(rowkey.getBytes());
put.add("cf".getBytes(), "dnum".getBytes(), dnum.getBytes());
put.add("cf".getBytes(), "length".getBytes(), length.getBytes());
put.add("cf".getBytes(), "type".getBytes(), type.getBytes());
put.add("cf".getBytes(), "date".getBytes(), date.getBytes());
list.add(put); }
}
table.put(list);
}
/*
* 使用protobuf进行数据插入
*
*/
@Test
public void insertDB3() throws ParseException, RetriesExhaustedWithDetailsException, InterruptedIOException{
List<Put> list = new ArrayList<Put>();
for(int i=0;i<5;i++){
String phoneNum = getPhone("158");
for(int j= 0; j<1000;j++){
//产生一些其他类型的数据
String dnum = getPhone("182");
String length = r.nextInt(99)+"";
String type = r.nextInt(2)+"";
String date = getDate("2019");
//随机产生一个rowkey
String rowkey = phoneNum+"_"+(Long.MAX_VALUE-sdf.parse(date).getTime());
Phone.PhoneDetail.Builder phoneDetail = Phone.PhoneDetail.newBuilder();
phoneDetail.setDate(date);
phoneDetail.setDnum(dnum);
phoneDetail.setLength(length);
phoneDetail.setType(type);
Put put = new Put(rowkey.getBytes());
put.add("cf".getBytes(), "phoneDetail".getBytes(), phoneDetail.build().toByteArray());
//注:不能写成phoneDetail.toString().getBytes(),这样会将只想对象的地址转化为字节数组 list.add(put); }
}
table.put(list);
}
/*
* 以用户作为rowkey进行数据压缩
*
*
*/
@Test
public void insertDB4() throws ParseException, RetriesExhaustedWithDetailsException, InterruptedIOException{
List<Put> puts = new ArrayList<Put>();
for(int i =0;i<10;i++){
String phoneNum = getPhone("158");
String rowkey = phoneNum+"_"+(Long.MAX_VALUE-sdf.parse("20190101000000").getTime());
Phone.dayPhoneDetail.Builder dayPhone = Phone.dayPhoneDetail.newBuilder();
for (int j = 0 ;j<1000;j++){
//产生一些其他类型的数据
String dnum = getPhone("182");
String length = r.nextInt(99)+"";
String type = r.nextInt(2)+"";
String date = getDate2("20190101");
//随机产生一个rowkey
Phone.PhoneDetail.Builder phoneDetail = Phone.PhoneDetail.newBuilder();
phoneDetail.setDate(date);
phoneDetail.setDnum(dnum);
phoneDetail.setLength(length);
phoneDetail.setType(type);
dayPhone.addDayofPhone(phoneDetail);
}
Put put = new Put(rowkey.getBytes());
put.add("cf".getBytes(), "day".getBytes(),dayPhone.build().toByteArray());
puts.add(put);
}
table.put(puts);
} private String getDate2(String string) {
return string+String.format("%02d%02d%02d",r.nextInt(24),r.nextInt(60),r.nextInt(60));
} /*
* 通过get方法获取一条用protobuf存储的数据
*
*/
@Test
public void get2() throws IOException{
Get get = new Get("15865543021_9223370490642209807".getBytes());
Result re = table.get(get);
Cell cell = re.getColumnLatestCell("cf".getBytes(), "phoneDetail".getBytes());
//将获取到的Cell字节数组转化为一个对象
Phone.PhoneDetail phoneDetail1 = Phone.PhoneDetail.parseFrom(CellUtil.cloneValue(cell));
System.out.println(phoneDetail1); } /*
* 用get方法获取之前插入的数据
*
*
*/
@Test
public void get3() throws IOException{
int count = 0;
Get get = new Get("15897845910_9223370490582775807".getBytes());
Result re = table.get(get);
Cell cell = re.getColumnLatestCell("cf".getBytes(), "day".getBytes());
//将获取到的Cell字节数组转化为一个对象
Phone.dayPhoneDetail dayPhone = Phone.dayPhoneDetail.parseFrom(CellUtil.cloneValue(cell));
for(PhoneDetail pd: dayPhone.getDayofPhoneList()){ System.out.println(pd);
count++;
} System.out.println(count);
} /*
* 查询某一个用户2月份的所有通话记录
*
*/
@Test
public void scan2() throws ParseException, IOException{
String phoneNum = "15890601889";
String startRow = phoneNum+"_"+(Long.MAX_VALUE-sdf.parse("20190301000000").getTime());
String stopRow = phoneNum+"_"+(Long.MAX_VALUE-sdf.parse("20190201000000").getTime());
Scan scan= new Scan();
scan.setStartRow(startRow.getBytes());
scan.setStopRow(stopRow.getBytes());
//从table对象中获取scan对象
ResultScanner rss = table.getScanner(scan);
for(Result rs : rss){
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "dnum".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "length".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "type".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "date".getBytes())))));
} } /*
* 查询主叫用户的数据
* 用过滤器对主叫用户的数据进行过滤
*
*/
@Test
public void filter() throws IOException{
String phoneNum = "15890601889";
FilterList lists = new FilterList();
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("cf".getBytes(), "type".getBytes(), CompareOp.EQUAL, "1".getBytes());
PrefixFilter filter2 = new PrefixFilter(phoneNum.getBytes());
lists.addFilter(filter1);
lists.addFilter(filter2);
Scan scan = new Scan();
scan.setFilter(lists);
ResultScanner rss = table.getScanner(scan);
for(Result rs : rss){
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "dnum".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "length".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "type".getBytes())))));
System.out.println(new String(CellUtil.cloneValue((rs.getColumnLatestCell("cf".getBytes(), "date".getBytes())))));
} } private String getDate(String string) { return string+string.format("%02d%02d%02d%02d%02d", r.nextInt(12)+1,r.nextInt(31),r.nextInt(24),r.nextInt(60),r.nextInt(60));
} Random r = new Random();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
private String getPhone(String string){
//产生一个8位的随机整数,当数据不足8位的时候,在前面用0补齐
return string+String.format("%08d", r.nextInt(99999999)); } //用get的方式获取数据
@Test
public void get() throws IOException{
String rowkey = "111111"; Get get = new Get(rowkey.getBytes());
Result rs = table.get(get);
//Bytes.toString((rs.getValue("cf".getBytes(), "name".getBytes())));
System.out.println("+++++++++++++++数据开始得到+++++++++++++++");
Cell cell = rs.getColumnLatestCell("cf".getBytes(), "name".getBytes());
//System.out.println(org.apache.hadoop.hbase.util.Bytes.toString(cell.getValue()));
String mm = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(mm);
System.out.println("++++++++++++++++数据已经得到+++++++++++++++++++++"); } @After
public void destroy() throws IOException{
if(admin!=null){
admin.close();
} if(table!=null){
table.close(); }
} }

hbase--知识点总结2的更多相关文章

  1. hbase 知识点

    hbase 教程:http://www.yiibai.com/hbase/ mac下hbase安装:https://www.jianshu.com/p/510e1d599123 HBase是建立在Ha ...

  2. 大白话详解大数据HBase核心知识点,老刘真的很用心(2)

    前言:老刘目前为明年校招而努力,写文章主要是想用大白话把自己复习的大数据知识点详细解释出来,拒绝资料上的生搬硬套,做到有自己的理解! 01 HBase知识点 第6点:HRegionServer架构 为 ...

  3. 大白话详解大数据HBase核心知识点,老刘真的很用心(3)

    老刘目前为明年校招而努力,写文章主要是想用大白话把自己复习的大数据知识点详细解释出来,拒绝资料上的生搬硬套,做到有自己的理解! 01 HBase知识点(3) 第13点:HBase表的热点问题 什么是热 ...

  4. 用大白话讲大数据HBase,老刘真的很用心(1)

    老刘今天复习HBase知识发现很多资料都没有把概念说清楚,有很多专业名词一笔带过没有解释.比如这个框架高性能.高可用,那什么是高性能高可用?怎么实现的高性能高可用?没说! 如果面试官听了你说的,会有什 ...

  5. Hbase--知识点总结3

    Hbase知识点总结:  hbase表中为什么列族的数量不能太多? 因为当一个列族数据溢写的时候,其他列族也会发生数据溢写,但是其他列族中数据的数量还没有达到溢写的阈值,就会导致产生的小文件数量增多. ...

  6. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  7. HBase核心知识点总结

    一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...

  8. 一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!

    一.HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会 ...

  9. Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

    转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...

  10. 【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

    介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于& ...

随机推荐

  1. MacBook使用笔记2 - 安装windows虚拟机攻略

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5498878.html 5月初从阿里滚粗,然后失去了公司发的Mac Air.说实话Mac机器确实比windows好用一 ...

  2. 结构体的数据对齐 #pragma浅谈

    之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef ...

  3. # 20175120 2018.3.3 《Java程序设计》第1周学习总结

    ## 教材学习内容总结 1.安装ubuntu,在实验楼学习liunx系统各种功能的实现.2.在ubuntu平台上进行java程序的编写3.学会使用JDB调试java程序,并将代码上传到码云上4.学习j ...

  4. jmeter压测、操作数据库、分布式linux下运行、webservice接口测试、charles抓包

    一.jmeter压测 在线程组中设置好,然后添加http请求,t添加聚合报告查看压力测试结果,如图: 一般压测时间10-15分钟,如果是稳定性测试,一般n*12小时,这些并发用户一直在请求. tps: ...

  5. day06 内存地址 小数据池缓存机制

    1. 内存相关 示例一 v1=[11,22,33] v2=[11,22,33] #值相等 内存地址不等 v1=11 v2=11 #按理说内存地址应该不等,但是python为了优化使其内存地址相等 v1 ...

  6. crontab 相关

    修改编辑器    select-editor 查看服务状态  service cron status  (linux下为crond ,ubuntu为cron) 1-59/2 1,10,12 * * * ...

  7. [JLOI2011]不重复数字

    原题链接 题解 题目大意:给出N个数,要求把其中重复的去掉,只保留第一次出现的数.最后按顺序输出N <= 50000 然这题是个哈希的典型题目 HASH,我对于它的理解就是一个桶%一个数,当然并 ...

  8. Hbase 与Hive整合

    HBase与Hive的对比 25.1.Hive 25.1.1.数据仓库 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询. 25.1.2. ...

  9. Java8 新特性学习

    摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...

  10. Intellij IDEA 为常用代码添加快捷代码,补全代码