> 可以用两行代码搞定Hbase的预分区设计,我们在新建一张表的时候有没有发现,做预分区其实也是要计算的,如果没有写上工具类那可惨了,需要自己用手指头算了,在这给大家提供了一个10进制跟16进制的版本,会根据Region数来平均范围,大家可以当成工具类来使用。
![大数据 Hbase 做预分区的技巧](https://upload-images.jianshu.io/upload_images/9028759-a347afda2d847ab8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 使用方法
scala 版本
```
/**
* Hbase 预分区转换
* @param region Hbase regionServer 的节点数
* @param radix 进制 10 | 16
* @param start 开始 => 比如:00
* @param end 结束 => 比如:ff
* @return Array
*/
def getSplitForRadix(region: Int, radix: Int, start: String, end: String): Array[String] = {
val range = start.toInt to java.lang.Long.valueOf(end, radix).toInt
range
.filter(_ % (range.size / region) == 0)
.map(if (radix == 16) Integer.toHexString else _.toString)
.tail //Hbase 左闭右开
.toArray
}
```
java版本
```
public static List<String> getSplitForRadix(int region, int radix, String start, String end) {
Integer s = Integer.parseInt(start);
Integer e = Long.valueOf(end, radix).intValue() + 1;
return IntStream
.range(s, e)
.filter(value -> (value % ((e - s) / region)) == 0)
.mapToObj(value -> {
if (radix == 16) {
return Integer.toHexString(value);
} else {
return String.valueOf(value);
}
})
.skip(1)
.collect(Collectors.toList());
}
```
## 案例使用
我有8台RegionServer,想做10进制的预分区
```
val region = 8
val radix = 10
val start = "00"
val end = "99"
println(getSplitForRadix(region, radix, start, end).mkString(","))
```
生成结果如下
```
12,24,36,48,60,72,84,96
```
如果是16进制的预分区
```
val region = 8
val radix = 16
val start = "00"
val end = "ff"
println(getSplits(region, radix, start, end).mkString(","))
```
生成结果如下
```
20,40,60,80,a0,c0,e0
```
**PS: 我相信你们不会挑我代码毛病的对吧,哈哈**
---
![](https://upload-images.jianshu.io/upload_images/9028759-07315bb8dadcd082.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)