智慧出行/HBase-实现创建hbase表,和向hbase插入数据

13 篇文章 0 订阅
7 篇文章 0 订阅
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)


    }
  }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值