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查询数据**
- 浏览表所有数据:已经排过序,先按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
- 指定版本数量进行浏览
hbase(main):110:0> scan 'ns3:emp',{VERSIONS=>3}
hbase(main):110:0> scan 'ns3:emp',VERSIONS=>3
- 指定列进行浏览
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
- 限定行范围进行浏览(分页查询)
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进行指定行浏览该行内的数据
- 查询指定行
hbase(main):140:0> get 'ns3:emp','rk0001'
- 查询指定行中的列
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']}
- 指定版本号
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) 更新数据
- 使用put
hbase(main):159:0> put 'ns3:emp','rk0001','base_info:name','smith'
- 使用incr,进行自动赋值
incr 'ns3:emp','rk0001','base_info:age'
5) 删除数据:
- 删除某行内的指定key-value对
hbase(main):001:0> delete 'ns3:emp','rk0001','base_info:name'
- 删除指定版本号的单元格
hbase(main):008:0> delete 'ns3:emp','rk0001','base_info:empno',1568619337238
- 删除指定行
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)
}