通过Java 操作Hbase

通过Java 操作Hbase


一、版本:

hbase:


二、操作Hbase:

1、首先定义几个用的到的全局变量:

HBaseAdmin :主要对于表的一些设置操作

HBaseAdmin hBaseAdmin;

HTable:主要涉及到对标内容的操作

HTable hTable;

TN:测试的表名

String TN = "lillcol";

2、创建begin()方法初始化资源:

//初始化Configuration  hBaseAdmin hTable

public void begin() throws Exception {

Configuration conf = new Configuration();

// conf.set("hbase.zookeeper.quorum", "node1.noce2.noce3");

hBaseAdmin = new HBaseAdmin(conf);

hTable = new HTable(conf, TN);

}

3、创建end()方法关闭资源:

//关闭hBaseAdmin  hTable 资源 注意先判断是否为null

public void end() {

if (hBaseAdmin != null) {

try {

hBaseAdmin.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (hTable != null) {

try {

hTable.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

4、创建一个Table

注:不同版本可能会有不一样的方法,此方法适合0.9的,至于1.0是否能用后面会尝试 

//创建一个新的Table


public void createTable() throws Exception {


//初始化

begin();

//首先判断表存不存在  存在删除

if (hBaseAdmin.tableExists(TN)) {

hBaseAdmin.disableTable(TN);

hBaseAdmin.deleteTable(TN);

}

//1.2以后的版本 好像不用 HTableDescriptor了

//过段时间在更新1.2以后的版本

HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TN));

//创建列族

HColumnDescriptor family1 = new HColumnDescriptor("column1");

//对表的一些设置

family1.setBlockCacheEnabled(true);

family1.setInMemory(true);

family1.setMaxVersions(2);

//添加列族

desc.addFamily(family1);

hBaseAdmin.createTable(desc);

System.out.println("create table success");

//关闭资源

end();

}

5、模拟插入数据(参考了尚学堂的学习资料 模拟数据)

// 获得手机号   

 public String getPhoneNum(String prefix) {        

return prefix + String.format("%8d", r.nextInt(999999999));

    } 

   //获得日期    public String getDate(String year) { 

       return year+ String.format(  "%02d%02d%02d%02d%02d", new Object[] { r.nextInt(12) + 1, r.nextInt(29) + 1, r.nextInt(60), r.nextInt(60), r.nextInt(60) });    } 

   public void insertDB() throws Exception {  

      begin();   

   // 创建一个List缓存     

   Listputs = new ArrayList();

//为一个用户生成十条模拟数据

for (int i = 0; i < 10; i++) {

String rowKey;

String phoneNum = getPhoneNum("186");

for (int j = 0; j < 100; j++) {

String phoneData = getDate("2016");

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

try {

long dataLong = sdf.parse(phoneData).getTime();

rowKey = phoneNum + (Long.MAX_VALUE - dataLong);

// System.out.println(rowKey);

Put put = new Put(rowKey.getBytes());

put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());

//将入list缓存

puts.add(put);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//批量添加数据

hTable.put(puts);

end();

}


6、查询数据

//查询数据


public void scandDB() throws Exception {

begin();

Scan scan = new Scan();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

//设置开始rowKey  和结束rowKey

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

//rs.getColumnLatestCell("colmun1".getBytes(), "name".getBytes())) 获取到的数据需要经过CellUtil.cloneValue在转换成String

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}


7、带过滤器的查询

//具体的方法可以去看官网的文档

//带过滤器的查询


public void scandDB2() throws Exception {

begin();

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);

PrefixFilter prefixFilter = new PrefixFilter("18827385967".getBytes());

list.addFilter(prefixFilter);

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(

"colmun1".getBytes(), "name".getBytes(), CompareOp.EQUAL, "lillcol".getBytes());

list.addFilter(singleColumnValueExcludeFilter);

Scan scan = new Scan();

scan.setFilter(list);

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

8、获取某条数据

//获取某条数据


public void get() throws Exception {

begin();

// 手机号_时间戳

String rowKey = "133456789755_20170932438765";

Get get = new Get(rowKey.getBytes());

get.addColumn("column1".getBytes(), "name".getBytes());

get.addColumn("column1".getBytes(), "age".getBytes());

Result result = hTable.get(get);

KeyValue columnLatest = result.getColumnLatest("column".getBytes(), "name".getBytes());

System.out.println("----------" + new String(CellUtil.cloneValue(columnLatest)));

end();

}

9、main方法

public static void main(String[] args) throws Exception {


HbaseDemo hbaseDemo = new HbaseDemo();

System.out.println("create table main ");

hbaseDemo.createTable();

System.out.println("insert table main ");

hbaseDemo.insertDB();

}


10、完整源码

package cn.lillcol.sxt;import java.io.IOException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import java.util.Random;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.KeyValue;import org.apache.hadoop.hbase.TableName;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.filter.CompareFilter.CompareOp;import org.apache.hadoop.hbase.filter.FilterList;import org.apache.hadoop.hbase.filter.PrefixFilter;import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;

public class HbaseDemo {  

  HBaseAdmin hBaseAdmin;  

  HTable hTable;  

 String TN = "lillcol"; 

   Random r = new Random(); 

   // 初始化

Configuration hBaseAdmin hTable    

public void begin() throws Exception {        

Configuration conf = new Configuration();    

//集群跑的时候不设置  本地需要设置   

 // conf.set("hbase.zookeeper.quorum", "node1.noce2.noce3");      

  hBaseAdmin = new HBaseAdmin(conf);      

  hTable = new HTable(conf, TN);  

  }  

  // 关闭hBaseAdmin hTable 资源 注意先判断是否为null   

 public void end() {        

if (hBaseAdmin != null) {   

         try {      

          hBaseAdmin.close();     

       } catch (IOException e) {      

          // TODO Auto-generated catch block              

  e.printStackTrace();      

      }   

     }    

   if (hTable != null) {       

     try {         

       hTable.close();           

 } catch (IOException e) {  

             // TODO Auto-generated catch block        

        e.printStackTrace();            }        }    }   

 // 创建一个新的Table    

public void createTable() throws Exception {   

     // 初始化      

  begin();       

 // 首先判断表存不存在 存在删除      

  if (hBaseAdmin.tableExists(TN)) {    

        hBaseAdmin.disableTable(TN);    

       hBaseAdmin.deleteTable(TN);    

    }     

   // 1.2以后的版本 好像不用 HTableDescriptor了    

    // 过段时间在更新1.2以后的版本     

   HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TN));  

      // 创建列族     

   HColumnDescriptor family1 = new HColumnDescriptor("column1");   

     // 对表的一些设置    

    family1.setBlockCacheEnabled(true);   

     family1.setInMemory(true);    

    family1.setMaxVersions(2);       

// 添加列族    1.2版本好像不支持addFamily(方法了)

    desc.addFamily(family1);  

      hBaseAdmin.createTable(desc);  

      System.out.println("create table success"); 

       // 关闭资源   

     end();    }   

 public void insert() throws Exception {   

     begin(); 

       Listputs = new ArrayList(); 

       // 手机号_时间戳   

     String rowKey = "133456789755_20170932438765";  

     Put put = new Put(rowKey.getBytes());  

      put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());        put.add("column1".getBytes(), "age".getBytes(), "20".getBytes());  

      puts.add(put);  

      if (puts.size() > 10) {      

      hTable.put(puts); 

           puts.removeAll(puts);  

      }  

      end();

    }  

  //获取某条数据 

   public void get() throws Exception {    

    begin();  

      // 手机号_时间戳      

  String rowKey = "133456789755_20170932438765"; 

       Get get = new Get(rowKey.getBytes());  

      get.addColumn("column1".getBytes(), "name".getBytes());  

      get.addColumn("column1".getBytes(), "age".getBytes());  

      Result result = hTable.get(get); 

       KeyValue columnLatest = result.getColumnLatest("column".getBytes(), "name".getBytes()); 

       System.out.println("----------" + new String(CellUtil.cloneValue(columnLatest)));   

     end();  

  }

    // 获得手机号   

 public String getPhoneNum(String prefix) {    

    return prefix + String.format("%8d", r.nextInt(999999999));   

 }   

 //获得日期   

 public String getDate(String year) {    

    return year + String.format( "%02d%02d%02d%02d%02d", new Object[] { r.nextInt(12) + 1, r.nextInt(29) + 1, r.nextInt(60), r.nextInt(60),  r.nextInt(60) });  

  }  

  public void insertDB() throws Exception {    

    begin();   

   // 创建一个List缓存     

   Listputs = new ArrayList();

//为一个用户生成十条模拟数据

for (int i = 0; i < 10; i++) {

String rowKey;

String phoneNum = getPhoneNum("186");

for (int j = 0; j < 100; j++) {

String phoneData = getDate("2016");

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

try {

long dataLong = sdf.parse(phoneData).getTime();

rowKey = phoneNum + (Long.MAX_VALUE - dataLong);

// System.out.println(rowKey);

Put put = new Put(rowKey.getBytes());

put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());

//将入list缓存

puts.add(put);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//批量添加数据

hTable.put(puts);

end();

}

//查询数据

public void scandDB() throws Exception {

begin();

Scan scan = new Scan();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

//设置开始rowKey  和结束rowKey

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

//rs.getColumnLatestCell("colmun1".getBytes(), "name".getBytes())) 获取到的数据需要经过CellUtil.cloneValue在转换成String

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

//带过滤器的查询

public void scandDB2() throws Exception {

begin();

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);

PrefixFilter prefixFilter = new PrefixFilter("18827385967".getBytes());

list.addFilter(prefixFilter);

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(

"colmun1".getBytes(), "name".getBytes(), CompareOp.EQUAL, "lillcol".getBytes());

list.addFilter(singleColumnValueExcludeFilter);

Scan scan = new Scan();

scan.setFilter(list);

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

public static void main(String[] args) throws Exception {

HbaseDemo hbaseDemo = new HbaseDemo();

System.out.println("create table main ");

hbaseDemo.createTable();

System.out.println("insert table main ");

hbaseDemo.insertDB();

}

}


11、总结

由于刚接触hbase不久 所以如果文中内容有错误的话 欢迎指出  谢谢

此外 此文主要是本人学习hbase过程中参考尚学堂教程的一些总结!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容