package com.cartravel.hbase
import com.cartravel.loggings.Logging
import org.apache.hadoop.hbase.{HColumnDescriptor, HTableDescriptor, TableName}
import org.apache.hadoop.hbase.client.{Connection, Put, TableDescriptorBuilder}
import org.apache.hadoop.hbase.io.compress.Compression.Algorithm
import org.apache.hadoop.hbase.regionserver.BloomType
import org.apache.hadoop.hbase.util.Bytes
object hbaseOperation extends Logging {
private def createTableBySelfBuilt(conn:Connection,tableName:TableName,regionNum:Int,column:Array[String]): Unit ={
this.synchronized{
val admin = conn.getAdmin
try{
if (admin.tableExists(tableName)){
//要想创建表,需要一个表的描述器
val tbDesc: HTableDescriptor = new HTableDescriptor(tableName)
if (column != null){
column.foreach(c =>{
val hcd = new HColumnDescriptor(c.getBytes())
hcd.setBlockCacheEnabled(false)
hcd.setMaxVersions(1)
hcd.setBloomFilterType(BloomType.ROW) //布隆过滤器
hcd.setCompressionType(Algorithm.SNAPPY) //指定压缩方式
//将列表示器添加到表描述器里面
tbDesc.addFamily(hcd)
})
}
val sparkKeyBuilder = new SparkKeyBuilder()
val splitKeys = sparkKeyBuilder.getSplitKeys(regionNum)
//建表
admin.createTable(tbDesc,splitKeys)//拥有预分区的hbase表就创建完毕了
}
}catch {
case e:Exception=>
//邮件报警
}
}
}
//实现向hbase表插入数据
def putMapData(connection:Connection,
tableName:String,
regionNum:Int,
columnFamily:String,
key:String, //插入数据指定的rowkey
mapData:Map[String,String] //要插入的数据
): Unit ={
val admin = connection.getAdmin
val tb = TableName.valueOf(tableName)
if (!admin.tableExists(tb)){//如果表名是不存在的
//我们就创建表
createTableBySelfBuilt(connection,tb,regionNum,Array(columnFamily))
}else{
val table = connection.getTable(tb)
val rk: String = RowkeyUtils.getRowkey(key)
val rowkey = Bytes.toBytes(rk)
val put = new Put(rowkey)
if (mapData.nonEmpty){
for((k,v)<-mapData){
put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(k),Bytes.toBytes(v))
}
}
table.put(put)
}
}
}
智慧出行/HBase-实现创建hbase表,和向hbase插入数据
最新推荐文章于 2022-02-28 22:31:01 发布