hbase HexStringSplit预分区,spark通过bulkload入数据

7 篇文章 0 订阅

hbase建表语句

create 'test',{NAME=>'CF_1',COMPRESSION=>'SNAPPY'},{NUMREGIONS => 30, SPLITALGO => 'HexStringSplit'}

bulk load 数据到上面建的表

1、自定义spark的partitioner函数,使得rdd的分区和hbase hfile要求的region分区一致

class MyPartitioner(partitions: Int) extends Partitioner {
  override def numPartitions: Int = partitions

  //计算region的split键值,总数为partitions-1个
  val splits = new HexStringSplit().split(partitions).map(s => Bytes.toString(s))

  //根据rowkey前缀,计算该条记录输入哪一个region范围内
  def getPartitionNum(splits: Array[String], key: Any): Int = {
    var i = 0
    var foundIt = false
    while (i < splits.length && !foundIt) {
      if (key.asInstanceOf[(String, String)]._1.substring(0, 8) < splits(i)) {
        foundIt = true
      }
      i = i + 1
    }
    i
  }

  override def getPartition(key: Any): Int = key match {
    case null => 0
    case _ => getPartitionNum(splits, key)
  }
}

对spark产生的rdd进行重新分区

val saltedRDD = result.repartitionAndSortWithinPartitions(new MyPartitioner(partition))
    //构造hfile
    val rdd = saltedRDD.map(r => {
      val rowkey = r._1._1
      val cq = r._1._2
      val value = r._2
      val kv: KeyValue = new KeyValue(Bytes.toBytes(rowkey), "CF_1".getBytes(), cq.getBytes(), value.getBytes())
      (new ImmutableBytesWritable(Bytes.add(Bytes.toBytes(rowkey), Bytes.toBytes(r._1._2))), kv)
    })

ps:其他的bulkload hfile代码就不上传了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值