Hbase2x 增删改查 scala版

package com.sparkStudy.utils

import java.util

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.client.BufferedMutator.ExceptionListener
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{CompareOperator, HBaseConfiguration, TableName}
import org.slf4j.LoggerFactory

/**
  * @Author: JZ.Lee
  * @Description: HBase增删改查询
  * @Date: Created at 下午6:13 18-8-10
  * @Modified By:
  */
object HBaseUtils {

  private val LOGGER = LoggerFactory.getLogger(this.getClass)
  private var connection : Connection = null
  private var conf: Configuration = null

  private val comp = new util.HashMap[String, CompareOperator]()
  comp.put("EQUAL",CompareOperator.EQUAL)
  comp.put("GREATER",CompareOperator.GREATER)
  comp.put("GREATER_OR_EQUAL",CompareOperator.GREATER_OR_EQUAL)
  comp.put("LESS",CompareOperator.LESS)
  comp.put("LESS_OR_EQUAL",CompareOperator.LESS_OR_EQUAL)
  comp.put("NO_OP",CompareOperator.NO_OP)
  comp.put("NOT_EQUAL",CompareOperator.NOT_EQUAL)

  def init() = {
    /**
     * @Author:JZ.Lee
     * @Description:hbase连接初始化
     * @Date: 下午2:38 18-8-12
     * @Param []
     * @return void
     */
    conf = HBaseConfiguration.create()
    conf.set("hbase.zookeeper.quorum","lee")
    connection = ConnectionFactory.createConnection(conf)
  }

  /**
    * @Author:JZ.Lee
    * @Description:hbase连接断开
    * @Date: 下午2:38 18-8-12
    * @Param []
    * @return void
    */
  def closeConnection() = {
    connection.close()
  }

  /**
    * @Author:JZ.Lee
    * @Description:创建hbase表,考虑预分区和生命周期、blockcache等建表
    * @Date: 下午2:39 18-8-12
    * @Param [tableName, familyNames]
    * @return boolean
    */
  def createTable(tableName:String,
                  familyNames:Array[String])
  = {
    val admin = connection.getAdmin
    val name = TableName.valueOf(tableName)
//    创建表descriptor,HBase2.0.0之后HTable替换为TableDescriptor
    val tableDesc = TableDescriptorBuilder.newBuilder(name)
    if(admin.tableExists(name)) false
    try{
//      添加列族变更
      familyNames.foreach(
        familyName=>{
          tableDesc.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes
            .toBytes(familyName))
            .build())
        }
      )
//      创建表
      admin.createTable(tableDesc.build())
      true
    }catch {
      case e:Throwable => e.printStackTrace()
        false
    }
  }

  /**
    * @Author:JZ.Lee
    * @Description:
    * @Date: 下午2:44 18-8-12
    * @Param [tableName, familyNames, liveTime]
    * @return boolean
    */
  def createTable(tableName:String,
                  familyNames:Array[String],liveTime:Int)
  = {
    val admin = connection.getAdmin
    val name = TableName.valueOf(tableName)
//    创建表descriptor,HBase2.0.0之后HTable替换为TableDescriptor
    val tableDesc = TableDescriptorBuilder.newBuilder(name)
    if(admin.tableExists(name)) false
    try{
//      添加列族变更,设置生命周期
      familyNames.foreach(
        familyName=>{
          tableDesc.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes
            .toBytes(familyName)).setTimeToLive(liveTime)
            .build())
        }
      )
//      创建表
      admin.createTable(tableDesc.build())
      true
    }catch {
      case e:Throwable => e.printStackTrace()
        false
    }
  }

  def getPutAction(rowKey:String, familyName:String,
                   columns:Array[String],
                   values:Array[String]):Put = {
    val put:Put = new Put(Bytes.toBytes(rowKey))
    for(i <- 0 until(columns.length)){
      put.addColumn(Bytes.toBytes(familyName),Bytes
        .toBytes(columns(i)),Bytes.toBytes(values(i)))
    }
    put
  }

  def insertDataBatchEx(tableName:String,puts:java.util.List[Put]) = {
    /**
     * @Author:JZ.Lee
     * @Description:异步批量写入HBase
     * @Date: 下午3:34 18-8-11
     * @Param [tableName, puts]
     * @return void
     */
    val name = TableName.valueOf(tableName)
//    监听hbase写入失败
    val listener = new ExceptionListener {
      override def onException
      (e: RetriesExhaustedWithDetailsException, bufferedMutator: BufferedMutator): Unit = {
        for(i <- 0 util e.getNumExceptions){
          LOGGER.info("写入put失败: " + e.getRow(i) )
        }
      }
    }
//    BufferedMutatorParams替代HTable.setAutoFlush
    val params = new BufferedMutatorParams(name).listener(listener)
//    设置写入缓冲区大小
    params.writeBufferSize(4*1024*1024)
    try{
      val mutator = connection.getBufferedMutator(params)
      mutator.mutate(puts)
      mutator.close()
    }
  }

  /**
    * @Author:JZ.Lee
    * @Description:全表扫描
    * @Date: 下午2:45 18-8-12
    * @Param [tableName]
    * @return org.apache.hadoop.hbase.client.ResultScanner
    */
  def getScan(tableName:String) = {
    val table = connection.getTable(TableName.valueOf(tableName))
    val scaner = new Scan()
    scaner.setCacheBlocks(false)
    table.getScanner(scaner)
  }

  /**
    * @Author:JZ.Lee
    * @Description:扫描指定范围rowkey
    * @Date: 下午2:46 18-8-12
    * @Param [tableName, startRowKey, endRowKey, family, column]
    * @return org.apache.hadoop.hbase.client.ResultScanner
    */
  def getScan(tableName:String, startRowKey:String,
              endRowKey:String, family:String,
              column:String) = {
    val table = connection.getTable(TableName.valueOf(tableName))
    val scaner = new Scan()
      .withStartRow(Bytes.toBytes(startRowKey))
      .withStopRow(Bytes.toBytes(endRowKey))

    scaner.addColumn(Bytes.toBytes(family),Bytes.toBytes(column))
    scaner.setCacheBlocks(false)
    table.getScanner(scaner)
  }

  def getResult(tableName:String,rowKey:String) = {
    val get = new Get(Bytes.toBytes(rowKey))
    val table = connection.getTable(TableName.valueOf(tableName))
    table.get(get)
  }

  def getResults(tableName:String,gets:java.util
  .List[Get]) = {
    connection.getTable(TableName.valueOf(tableName)).get(gets)
  }

  /**
    * @Author:JZ.Lee
    * @Description:删除表
    * @Date: 下午2:48 18-8-12
    * @Param [tableName]
    * @return boolean
    */
  def deleteTable(tableName:String) = {
    val admin = connection.getAdmin
    val name = TableName.valueOf(tableName)
    try{
      if(admin.tableExists(name)){
        admin.disableTable(name)
        admin.deleteTable(name)
      }
    }catch {
      case e:Throwable=>e.printStackTrace()
        false
    }
    true
  }

  /**
    * @Author:JZ.Lee
    * @Description:删除表指定rowKey行
    * @Date: 下午2:50 18-8-12
    * @Param [tableName, rowKey]
    * @return void
    */
  def deleteColumn(tableName:String,rowKey:String) = {
    val table = connection.getTable(TableName.valueOf(tableName))
    table.delete(new Delete(Bytes.toBytes(rowKey)))
  }

  /**
    * @Author:JZ.Lee
    * @Description:删除并更新指定value
    * @Date: 下午2:52 18-8-12
    * @Param [tableName, rowKey, family, column, compareon, value, newValue]
    * @return boolean
    */
  def updateByDelete(tableName:String,rowKey:String,
             family:String,column:String,
             compareon:String,value:String,
             newValue:String) = {
    val name = TableName.valueOf(tableName)
    if(comp.get(compareon.toUpperCase) == null) false
    val table = connection.getTable(name)
    //hbase2x delete和put继承Mutation,RowMutations.add建议采用Mutation
    val delete:Mutation = new Delete(Bytes.toBytes
    (rowKey)).addColumn(Bytes.toBytes(family),Bytes.toBytes(column))
    val mut = new RowMutations(Bytes.toBytes(rowKey))
    mut.add(delete)
    val put:Mutation = new Put(Bytes.toBytes(rowKey))
      .addColumn(Bytes.toBytes(family),Bytes.toBytes
      (column),Bytes.toBytes(newValue))
    mut.add(put)
    println("------" + comp.get(compareon.toUpperCase()))
    //hbase2x checkAndMutate建议采用lambda api
    table.checkAndMutate(Bytes.toBytes(rowKey),Bytes
      .toBytes(family)).qualifier(Bytes.toBytes(column))
      .ifMatches(comp.get(compareon.toUpperCase()),Bytes.toBytes(value))
      .thenMutate(mut)
  }

  /**
    * @Author:JZ.Lee
    * @Description:更新指定value
    * @Date: 下午2:53 18-8-12
    * @Param [tableName, rowKey, family, column, compareon, value, newValue]
    * @return boolean
    */
  def updateByCover(tableName:String,rowKey:String,
                    family:String,column:String,
                    compareon:String,value:String,
                    newValue:String) = {
    val name = TableName.valueOf(tableName)
    if(comp.get(compareon.toUpperCase) == null) false
    val table = connection.getTable(name)
    val mut = new RowMutations(Bytes.toBytes(rowKey))
    val put:Mutation = new Put(Bytes.toBytes(rowKey))
      .addColumn(Bytes.toBytes(family),Bytes.toBytes
      (column),Bytes.toBytes(newValue))
    mut.add(put)
    table.checkAndMutate(Bytes.toBytes(rowKey),Bytes
      .toBytes(family)).qualifier(Bytes.toBytes(column))
      .ifMatches(comp.get(compareon.toUpperCase()),Bytes.toBytes(value))
      .thenMutate(mut)
  }

  /**
    * @Author:JZ.Lee
    * @Description:指定时间戳查询数据
    * @Date: 下午2:54 18-8-12
    * @Param [tableName, rowKey, family, column, timestamp]
    * @return org.apache.hadoop.hbase.client.Result
    */
  def findByOldTime(tableName:String,rowKey:String,
                    family:String,column:String,
                    timestamp:Long) = {
    val name = TableName.valueOf(tableName)
    val table = connection.getTable(name)
    val get = new Get(Bytes.toBytes(rowKey))
    get.setTimestamp(timestamp)
    get.addColumn(Bytes.toBytes(family),Bytes.toBytes(column))
    table.get(get)
  }
}

 

Java可以通过HBase的Java API来实现对HBase数据的增删改查操作。以下是示例代码: 1. 首先需要创建一个HBase配置对象`Configuration`并设置相关参数: ```java Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "server1,server2,server3"); conf.set("hbase.zookeeper.property.clientPort", "2181"); ``` 2. 获取HBase的客户端对象`Connection`: ```java Connection connection = ConnectionFactory.createConnection(conf); ``` 3. 获取操作某个表的HBase表对象`Table`: ```java TableName tableName = TableName.valueOf("table_name"); Table table = connection.getTable(tableName); ``` 4. 插入数据: ```java Put put = new Put(Bytes.toBytes("row_key")); put.addColumn(Bytes.toBytes("column_family"), Bytes.toBytes("column_qualifier"), Bytes.toBytes("value")); table.put(put); ``` 5. 查询数据: ```java Get get = new Get(Bytes.toBytes("row_key")); Result result = table.get(get); byte[] value = result.getValue(Bytes.toBytes("column_family"), Bytes.toBytes("column_qualifier")); String valueStr = Bytes.toString(value); ``` 6. 删除数据: ```java Delete delete = new Delete(Bytes.toBytes("row_key")); delete.addColumn(Bytes.toBytes("column_family"), Bytes.toBytes("column_qualifier")); table.delete(delete); ``` 7. 最后需要关闭`Table`和`Connection`对象: ```java table.close(); connection.close(); ``` 以上是Java调用HBase进行数据增删改查的简单示例代码,需要注意的是,实际应用中还需要进行一些异常处理等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值