作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7449682.html 转载请注明出处

最近在折腾pyspark的HbaseConverters,由于资料太少折腾了好一会儿才明白,特此分享给大家.


问题背景

最近在使用pyspark写hbase的过程中发现,会报以下类似的错误

这是由于最终计算结果存入hbase的时候pyspark无法找到相关的converter造成的.啥?你问为啥要找converter,这是因为Java和Scala都可以支持组装Hbase的Put然后存入Hbase,但是Python这块儿spark API是后妈生的,暂时还不能直接支持,所以需要转换.

问题详解

这个HBaseConverters模块位于spark-examples*.jar包下,据我挨个检查,spark1.4和spark1.6都有这个模块,而spark.2.x已经没有了,但是spark2.x上我测试了可以使用1.6的spark-examples_2.10-1.6.3.jar中的HBaseConverters来读写Hbase,完全没有问题.而Spark1.4和Spark1.6的HBaseConverters我推荐用后者,理由如下.

Spark1.4的HBaseConverters模块

这是一个scala文件,里面有4个class,细心观察的同学会发现,上面2个是读取Hbase用,下面2个是写入用,它们都继承了

org.apache.spark.api.python.Converter类,这个是pyspark的API,最终会调用四个子类来进行相应的读写.

Spark1.6的HBaseConverters模块

恩,仔细观察2个截图中的代码,唯一的区别在于第一个HBaseResultToStringConverter这个读取Hbase的Result转换类.

对,我想强调的就是这个转换类。Spark1.4的这个转换类仔细看代码

class HBaseResultToStringConverter extends Converter[Any, String] {

override def convert(obj: Any): String = {

val result = obj.asInstanceOf[Result]

Bytes.toStringBinary(result.value())

}

}

这个读取hbase的转换类得到Result后,最终返回的只是result.value()也就是列值.

然后观察spark1.6的这个转换类

class HBaseResultToStringConverter extends Converter[Any, String] {

override def convert(obj: Any): String = {

val result = obj.asInstanceOf[Result]

val output = result.listCells.asScala.map(cell =>

Map(

"row" -> Bytes.toStringBinary(CellUtil.cloneRow(cell)),

"columnFamily" -> Bytes.toStringBinary(CellUtil.cloneFamily(cell)),

"qualifier" -> Bytes.toStringBinary(CellUtil.cloneQualifier(cell)),

"timestamp" -> cell.getTimestamp.toString,

"type" -> Type.codeToType(cell.getTypeByte).toString,

"value" -> Bytes.toStringBinary(CellUtil.cloneValue(cell))

)

)

output.map(JSONObject(_).toString()).mkString("\n")

}

}

恩,注意中间的Map部,这个转换类首先将Result的各个部分读取出来(不止是value)封装成map,然后转换成Json字符串返回.

区别很明显了,明显1.6这个转换类更详细,我们能从中得到更多的内容.

问题总结

理解了上述HbaseConverters的本质以后,我们就能愉快的利用pyspark来快速读写hbase,要点如下

  • pyspark读取hbase时,定义好keyconverter和valueconverter及hbaseconf很关键,不会配置的可以参考我上篇文章
  • pyspark写入hbase时,同上定义好这几个配置,而最终需要保存到hbase的rdd,需要构造为(tablename,[rowkey,column_fm,columnname,columnvalue])这种元组字符串的格式,然后才可以成功的保存到hbase.
  • pyspark的HbaeConverters所在jar包需要加入spark的classpath中去(或者spark-submmit提交时跟参数--jars将具体jar包include进去),可以参考我上篇文章最后的spark classpath配置.

本来想直接贴调试过的代码的,但是总觉得MarkDown格式的代码引用格式不好用,还是直接截图吧,大家感受下就好

Pyspark的HBaseConverters详解的更多相关文章

  1. HUE配置文件hue.ini 的Spark模块详解(图文详解)(分HA集群和HA集群)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

  2. Hue的全局配置文件hue.ini(图文详解)

    Hue版本:hue-3.9.0-cdh5.5.4 需要编译才能使用(联网) 说给大家的话:大家电脑的配置好的话,一定要安装cloudera manager.毕竟是一家人的.同时,我也亲身经历过,会有部 ...

  3. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  8. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  9. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

随机推荐

  1. xdu_1077:循环节长度

    题意很简单,就是给出p,q,求p/q的循环节长度. 由循环小数的循环部分的值等于等比数列求和的值S,列公式得到最简分数分母的值.最终得10^x%q==1(其中q为经过modify之后的值).搞清这些之 ...

  2. 初次使用Mybatis配置出现错误待解决

    数据库: create table STUDENT ( STUID NUMBER(9) not null, SNAME VARCHAR2(50) not null, SEX VARCHAR2(4), ...

  3. centos7下编译安装mysql

    推荐: http://www.cnblogs.com/yunns/p/4877333.html

  4. (转)java.util.Scanner应用详解

    java.util.Scanner应用详解   java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...

  5. swift 3.0 基础练习 面向对象 类

    模拟需求 创建100个女朋友 1.用面向对象思想 2.名字随机 3.年龄随机 4.拥有约会功能 5.将所有女朋友信息输出 class GirlFirend: NSObject { var name:S ...

  6. ubuntu下处理mysql无法启动故障一例

    故障现象: mysql无法启动 1: dmesg |grep mysql [101353.820000] init: mysql post-start process (9077) terminate ...

  7. Java中synchronized和Lock的区别

    synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...

  8. hdu--1548--dfs--蜘蛛牌

    /* Name: hdu--1548--蜘蛛牌 Author: shen_渊 Date: 17/04/17 09:15 Description: dfs,不好想,看两个大神的代码好久http://ww ...

  9. PyCharm中光标变粗的解决方法

    pycharm中光标变粗,如下: 原因:光标进入了改写状态. 解决方法:按一下键盘中的Insert键就好了.

  10. akoj-1280另类阶乘问题

    另类阶乘问题 Time Limit:3000MS  Memory Limit:65536K Total Submit:22 Accepted:20 Description 大家都知道阶乘这个概念,举个 ...