我是51CTO学院讲师张敏,在51CTO学院 “4.20 IT充电节”(4月19~20日) 到来之际,和大年夜家分享一下Spark Core之上扩建本身的模块的经验。正文来啦~~~
hbase-rdd是一个构建在SparkContext基本之上的用于对Hbase进行增删改查的第三方开源模块,今朝最新版本为0.7.1。今朝该rdd在操作hbase时,默认调用隐式办法。
在应用hbase-rdd插件的过程中,我在思虑,默认的RDD上是没有toHbase办法的,那为什么惹人hbase-rdd包之后,RDD之上就有toHbase办法了?经由查看源码,发明hbase-rdd包中供给了两个隐式办法:
- implicitdef stringToBytes(s: String): Array[Byte] = {
- Bytes.toBytes(s)
- }
将RDD的key转换成字节b,然后调用Hbase的put(b)办法保存rowkey,之后将RDD的每一行存入hbase。
在轨迹图绘制项目数据计算中,我们推敲到hbase的rowkey的设计——尽量削减rowkey存储的开销。固然hbase-rdd最终的rowkey默认都是采取字节数组,但这个处所我们欲望按本身的方法组装rowkey。应用MD5(imei)+dateTime构成的字节数组作为rowkey。是以默认的hbase-rdd供给的办法是不知足我们存储需求的,须要对源代码进行修改。在toHbase办法中,有一个convert办法,该办法将对RDD中的每一行数据进行转化,应用RDD中的key生成Put(Bytes.toBytes(key))对象,该对象为之后存储Hbase供给rowkey。
在convert函数中,对其实现进行了改革,hbase-rdd默认应用stringToBytes隐式函数将RDD的String类型的key转换成字节数组,这里我们须要改革,不使stringToBytes隐式办法,而是直接生成字节数据。
- protected def convert(id: String, values: Map[String, Map[String, A]], put: PutAdder[A]) = {
- val strs = id.split(",")
- val imei = strs {0}
- val dateTime = strs {1}
- val b1 = MD5Utils.computeMD5Hash(imei.getBytes())
- val b2 = Bytes.toBytes(dateTime.toLong)
- val key = b1.++(b2)
- val p = new Put(key)//改革
- var empty = true
- for {
- (family, content) <- values
- (key, value) <- content
- } {
- empty = false
- if (StrUtils.isNotEmpty(family) &&StrUtils.isNotEmpty(key)) {
- put(p, family, key, value)
- }
- }
- if (empty) None else Some(new ImmutableBytesWritable, p)
- }
(19-20号两天,100门视频课程免单抢,更有视频课程会员享6折,非会员享7折,套餐折上8折,微职位立减2000元钜惠)
如许就实现了应用本身的方法构建rowkey,当然基于此思惟我们可以应用随便率性的方法构建rowkey。
- implicitdef toHBaseRDDSimple[A](rdd: RDD[(String, Map[String, A])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[A] =new HBaseWriteRDDSimple(rdd, pa[A])
推荐阅读
近些年来,人工智能范畴又活泼起来,除了传统了学术圈外,Google、Microsoft、facebook等工业界优良企业也纷纷成立相干研究团队,并取得了很多令人注目标结不雅。这要归功于社交收集用户产>>>详细阅读
本文标题:借hbase-rdd二次开发谈如何在Spark Core之上扩建自己的模块
地址:http://www.17bianji.com/lsqh/34785.html
1/2 1