import org.apache.hadoop.hbase.CellUtil
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.util.Bytes
/**
* Created by chb on 2019/3/30.
*/
object HbaseUtil {
val defaultShort: Short = -1
/**
* 获取hbase表指定列的最新版本的value
*
* @param res
* @param family
* @param qualifier
* @param defaultValue
* @tparam T
* @return
*/
def getValueFromHbaseResult[T](res: Result, family: String, qualifier: String, defaultValue: T): T = {
var outT: T = defaultValue
if (defaultValue.isInstanceOf[Long]) {
if (res.containsColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier))) {
outT = Bytes.toLong(CellUtil.cloneValue(res.getColumnLatestCell(Bytes.toBytes(family), Bytes.toBytes(qualifier)))).asInstanceOf[T]
}
} else if (defaultValue.isInstanceOf[Short]) {
if (res.containsColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier))) {
outT = Bytes.toShort(CellUtil.cloneValue(res.getColumnLatestCell(Bytes.toBytes(family), Bytes.toBytes(qualifier)))).asInstanceOf[T]
}
} else if (defaultValue.isInstanceOf[Int]) {
if (res.containsColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier))) {
outT = Bytes.toInt(CellUtil.cloneValue(res.getColumnLatestCell(Bytes.toBytes(family), Bytes.toBytes(qualifier)))).asInstanceOf[T]
}
}else if (defaultValue.isInstanceOf[String]) {
if (res.containsColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier))) {
outT = Bytes.toString(CellUtil.cloneValue(res.getColumnLatestCell(Bytes.toBytes(family), Bytes.toBytes(qualifier)))).asInstanceOf[T]
}
} else { //默认返回byte[]
if (res.containsColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier))) {
outT = CellUtil.cloneValue(res.getColumnLatestCell(Bytes.toBytes(family), Bytes.toBytes(qualifier))).asInstanceOf[T]
}
}
outT
}
}
在通过获取一个Short类型的数据Caused by: java.lang.IllegalArgumentException: offset (0) + length (4) exceed the capacity of the array: 2
非常困惑, 本来就是获取一个Short类型值, 将该值赋值与一个Int变量,
SparkUtil.readFromHbase("test", "181102", "181102~")
.map(t => {
var s: Int = -1
s = HbaseUtil.getValueFromHbaseResult(t._2, "v", "s", HbaseUtil.defaultShort) //该方法设置的就是Short类型
(s, 1)
})
.reduceByKey(_ + _)
.foreach(println)
传入的defaultShort类型没有变化, 是Short