千家信息网

怎么在Spark Core之上使用hbase-rdd扩建自己的模块

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"怎么在Spark Core之上使用hbase-rdd扩建自己的模块",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么在Spark
千家信息网最后更新 2026年11月04日怎么在Spark Core之上使用hbase-rdd扩建自己的模块

这篇文章主要为大家展示了"怎么在Spark Core之上使用hbase-rdd扩建自己的模块",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么在Spark Core之上使用hbase-rdd扩建自己的模块"这篇文章吧。

hbase-rdd是一个构建在SparkContext基础之上的用于对Hbase进行增删改查的第三方开源模块,目前***版本为0.7.1。目前该rdd在操作hbase时,默认调用隐式方法。

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)  }

这样就实现了使用自己的方式构建rowkey,当然基于此思想我们可以使用任意的方式构建rowkey。

在使用hbase-rdd插件的过程中,我在思考,默认的RDD上是没有toHbase方法的,那为什么引入hbase-rdd包之后,RDD之上就有toHbase方法了?经过查看源码,发现hbase-rdd包中提供了两个隐式方法:

implicitdef toHBaseRDDSimple[A](rdd: RDD[(String, Map[String, A])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[A] =new HBaseWriteRDDSimple(rdd, pa[A]) implicit def toHBaseRDDSimpleTS[A](rdd: RDD[(String, Map[String, (A, Long)])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[(A, Long)] =new HBaseWriteRDDSimple(rdd, pa[A])

这两个方法在发现RDD上没有toHbase方法时会自动尝试调用,从隐式定义中尝试找到解决方案,尝试之后发现有定义toHBaseRDDSimple隐式方法,于是调用该隐式方法新建HBaseWriteRDDSimple类,返回hBaseWriteRDDSimple,而在hBaseWriteRDDSimple对象中是有toHbase方法的,因此在引入hbase-rdd之后,可以发现原本没有toHbase方法的RDD上有toHbase方法了。这一切都要归功于Scala强大的隐式转换功能。

那明白了原理,是否我们可以基于RDD写自己的模块,说干就干!

***步:新建Trait

traitHaha{ implicitdef gaga[A](rdd: RDD[String]): Hehe= newHehe(rdd) }

第二步:新建Hehe类

final  class Hehe(rdd:RDD[String]) { def wow(tableName:String,family:String): Unit ={ println("---------------------------------------------") println("tableName:"+tableName+" - family:"+family) println("size:"+rdd.count()) rdd.collect().foreach(data=>println(data)) println("---------------------------------------------")    } }

第三步:新建包对象

package object test extends Haha

第四步:新建test类

object Test{ def main(args: Array[String]) { valsparkConf = new SparkConf().setAppName("Test") valsc = new SparkContext(sparkConf) sc.makeRDD(Seq("one","two","three","four")).wow("taskDataPre","T")   } }

项目结构图:

运行效果图:

以上是"怎么在Spark Core之上使用hbase-rdd扩建自己的模块"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

方法 模块 字节 对象 内容 数据 数组 方式 篇文章 存储 尝试 改造 一行 两个 函数 项目 学习 帮助 生成 强大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网最新的科技有限公司 期待互联网科技 互联网科技公司官网 互联网科技视频 智慧科技互联网 天津摩尔互联网科技 兼蜜互联网科技 互联网科技美容 贵州叶脉互联网科技有限公司所属行业 注册互联网科技公司经营范围大全 链环科技传统企业怎么转型互联网 互联网科技扶贫时间 国大互联网教育科技有限公司工作 中国互联网公司排名锤子科技 江苏苏星互联网科技有限公司 互联网科技快讯热点 互联网科技机房 科技互联网经济论坛 保山浩联互联网科技有限公司 高科技和互联网的现代国家 友谊互联网络科技 互联网公司会议桌创意科技软装饰 济南和联互联网科技有限公司 卫星互联网科技股票 西藏七维空间互联网科技有限公司 宝灵互联网科技有限公司 电子商务与互联网科技的关系 皮皮虾互联网科技有限公司 长沙渺峰互联网科技有限公司 株洲百竞科技的互联网营销顾问
0