Hbase table CRUD操作及scala编程

24 篇文章 2 订阅

Hbase shell操作

1) 插入数据:put只能插入一个单元格

指定 表名、行键、列名、列值、[时间戳]

hbase(main):081:0> put 'ns3:emp','rk0001','base_info:name','smith'
hbase(main):084:0> put 'ns3:emp','rk0001','base_info:empno','7369',1990000000
2) 使用scan查询数据**
  1. 浏览表所有数据:已经排过序,先按rowkey,再按列族名、然后按列名
  hbase(main):079:0> scan 'ns3:emp'
ROW                  COLUMN+CELL
 rk0001              column=base_info:name, timestamp=1603107690599, value=smith
 rk0001              column=base_info:rmpno, timestamp=1990000, value=7369
1 row(s) in 0.1300 seconds
  1. 指定版本数量进行浏览
   hbase(main):110:0> scan 'ns3:emp',{VERSIONS=>3}
   hbase(main):110:0> scan 'ns3:emp',VERSIONS=>3
  1. 指定列进行浏览
   hbase(main):122:0> scan 'ns3:emp',{COLUMNS=>'base_info:empno'}
   scan 'ns3:emp',{COLUMNS=>['base_info:empno','extra_info:province']} 
   hbase(main):091:0> scan 'ns3:emp',COLUMNS=>'base_info:rmpno'
ROW                                     COLUMN+CELL
 rk0001                                 column=base_info:rmpno, timestamp=1990000, value=7369
1 row(s) in 0.0450 seconds

关键字COLUMNS不能写错了.

hbase(main):092:0> scan 'ns3:emp',COLIUMNS=>'base_info:name'
NameError: uninitialized constant COLIUMNS

比如说你就想看name这一列的数据.

hbase(main):093:0> scan 'ns3:emp',COLUMNS=>'base_info:name'
ROW                                     COLUMN+CELL
 rk0001                                 column=base_info:name, timestamp=1603107690599, value=smith
  1. 限定行范围进行浏览(分页查询)
   hbase(main):137:0> scan 'ns3:emp',
   {COLUMNS=>'base_info:empno',LIMIT=>5,STARTROW=>'rk0001'}
   
   hbase(main):136:0> scan 'ns3:emp',{LIMIT=>5,STARTROW=>'rk0001'}
3) 使用get进行指定行浏览该行内的数据
  1. 查询指定行 hbase(main):140:0> get 'ns3:emp','rk0001'
  2. 查询指定行中的列
   hbase(main):155:0> get 'ns3:emp','rk0001','base_info:empno'
   hbase(main):155:0> get 'ns3:emp','rk0001',{COLUMN=>'base_info:empno'}
   hbase(main):157:0> get 'ns3:emp','rk0001','base_info:name','extra_info:province'    
   hbase(main):145:0> get 'ns3:emp','rk0001',{COLUMN=>
   ['base_info:empno','extra_info:province']}
  1. 指定版本号
  hbase(main):146:0> get 'ns3:emp','rk0001',{COLUMN=>['base_info:empno','extra_info:province'],VERSIONS=>3}
4. 指定时间戳的范围
   hbase(main):152:0> get 'ns3:emp','rk0001',{TIMERANGE=>[1568619337238,1568619348753]}

4) 更新数据

  1. 使用put
   hbase(main):159:0> put 'ns3:emp','rk0001','base_info:name','smith'
  1. 使用incr,进行自动赋值
   incr 'ns3:emp','rk0001','base_info:age'

5) 删除数据:

  1. 删除某行内的指定key-value对
   hbase(main):001:0> delete 'ns3:emp','rk0001','base_info:name'
  1. 删除指定版本号的单元格
  hbase(main):008:0> delete 'ns3:emp','rk0001','base_info:empno',1568619337238
  1. 删除指定行
   hbase(main):011:0> deleteall 'ns3:emp','rk0008'

6) 判断表是否存在

hbase(main):013:0> exists 'ns3:emp'

7) 禁用表和启用表

hbase(main):014:0> disable 'ns3:emp'
hbase(main):016:0> enable 'ns3:emp'

8) 统计表行数

hbase(main):018:0> count 'ns3:emp'

9) 清空表数据

hbase(main):019:0> truncate 'ns3:emp'

HBase Table CRUD scala编程

向table中添加数据

object Putdat extends App{
  //构造Put对象,参数rowkey
  private val put = new Put(Bytes.toBytes("rk0001"))
  //给put对象绑定列族,列以及值 
 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("lisi"))
  //添加另一个键值对
 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("age"),Bytes.toBytes("15"))
   //添加另一个键值对
  put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("height"),Bytes.toBytes("180"))
   //获取table对象
  private val table: Table = HbaseUtil.getTable("ns1:students")
  //提交
  table.put(put)
}

方法解析

public Put addColumn(byte[] family,
                     byte[] qualifier,
                     byte[] value)

批量添加数据

构建多个Put对象,然后储存到ArrayList后一并提交! 可以看出还是比较麻烦的!

object BatchPutdata extends App {

  import org.apache.hadoop.hbase.util.Bytes
  import java.util
  val list = new util.ArrayList[Put]()
  val put1 = new Put(Bytes.toBytes("rk00002"))
  put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("zhenji"))
  put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("23"))
  put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("f"))

  val put2 = new Put(Bytes.toBytes("rk00003"))
  put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("zhaoyun"))
  put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("25"))
  put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("m"))

  val put3 = new Put(Bytes.toBytes("rk00004"))
  put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("liubei"))
  put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("30"))
  put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("m"))
  private val table: Table = HbaseUtil.getTable("ns1:students")

  list.add(put1)
  list.add(put2)
  list.add(put3)
  table.put(list)
}

利用get获取某一行数据

import org.apache.hadoop.hbase.client.{Get, Result, Table}
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{Cell, CellScanner, CellUtil}

object getDat  extends App{
  //将rowkey包装成 get对象.因为hbase的查询主要依靠的就是rowkey
  private val get = new Get(Bytes.toBytes("rk0001"))
  //获取table对象
  private val table: Table = HbaseUtil.getTable("ns1:students")
  //将rowkey对象传给table的get方法,获取结果集合
  private val result: Result = table.get(get)
  //获取结果集的迭代器
  private val scanner: CellScanner = result.cellScanner()
  //迭代取出结果
  while(scanner.advance()){
    val cell: Cell = scanner.current()
    print(new String(CellUtil.cloneRow(cell))+"\t")
    print(new String(CellUtil.cloneFamily(cell))+"\t")
    print(new String(CellUtil.cloneQualifier(cell))+"\t")
    print(new String(CellUtil.cloneValue(cell))+"\t")
    println
  }
}
rk0001	f1	age	15	
rk0001	f1	ename	zhangsan	
rk0001	f1	gender	f	
rk0001	f1	height	180	
rk0001	f1	name	lisi	
rk0001	f1	salary	1324	

由于打印数据较为麻烦,将其封装到HbaseUtil工具类中

def printResult(result: Result): Unit = {
    val scanner: CellScanner = result.cellScanner()
    while (scanner.advance()) {
      val cell: Cell = scanner.current()
      print(new String(CellUtil.cloneRow(cell)) + "\t")
      print(new String(CellUtil.cloneFamily(cell)) + "\t")
      print(new String(CellUtil.cloneQualifier(cell)) + "\t")
      print(new String(CellUtil.cloneValue(cell)) + "\t")
      println
    }
  }

简化后就是

object getDat  extends App{
  private val get = new Get(Bytes.toBytes("rk0001"))
  private val table: Table = HbaseUtil.getTable("ns1:students")
  private val result: Result = table.get(get)
  HbaseUtil.printResult(result)
}

使用Scan获取数据

object ScanDemo extends App {
//构建scan对象,scan查询数据依据的也是rowkey,参数为起始rowkey和结束rowkey
  private val scan = new Scan(Bytes.toBytes("rk00001"), Bytes.toBytes("rk0001"))
  //获取table对象
  private val table: Table = HbaseUtil.getTable("ns1:students")
  //将rowkey传给table的getScanner方法
  private val scanner: ResultScanner = table.getScanner(scan)
  //获取一个迭代器,迭代出来的每一条为Result类型
  private val scit: util.Iterator[Result] = scanner.iterator()
  while (scit.hasNext) {
    val result: Result = scit.next()
    HbaseUtil.printResult(result)
  }
}

删除某一行

 def deleteRow(): Unit = {
       //删除也是依据rowkey来删除的
      val delete = new Delete(Bytes.toBytes("rk00001"))
      调用table对象的delete方法
      HbaseUtil.getTable("ns1:students").delete(delete)
    }

删除指定单元格

或者说删除某个rowkey下指定的键值对

 def deletCell(): Unit ={
    val delete = new Delete(Bytes.toBytes("rk0001"))
    delete.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("salary"))
    HbaseUtil.getTable("ns1:students").delete(delete)
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值