Pyspark的HBaseConverters详解
作者: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详解的更多相关文章
- HUE配置文件hue.ini 的Spark模块详解(图文详解)(分HA集群和HA集群)
不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...
- Hue的全局配置文件hue.ini(图文详解)
Hue版本:hue-3.9.0-cdh5.5.4 需要编译才能使用(联网) 说给大家的话:大家电脑的配置好的话,一定要安装cloudera manager.毕竟是一家人的.同时,我也亲身经历过,会有部 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
随机推荐
- Android - Fragment (三)不同Fragment之间的通信
在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentM ...
- Docker 中的一些概念
笔者使用 Mac 系统玩的,所以会更多阐述 Mac 上使用的一些东西. 在安装之前有些 Docker 相关的概念需要了解一下,以便我们更好了解 Docker. 简单来说,安装 Docker 之后,会在 ...
- NLP —— 图模型(一)隐马尔可夫模型(Hidden Markov model,HMM)
本文简单整理了以下内容: (一)贝叶斯网(Bayesian networks,有向图模型)简单回顾 (二)隐马尔可夫模型(Hidden Markov model,HMM) 写着写着还是写成了很规整的样 ...
- Python学习记录----IDE安装
摘要: 安装eric5 一 确定python版本 安装的最新版本:python3.3 下载连接:http://www.python.org/getit/ 二 确定pyqt版本 安装的最新版本:PyQt ...
- Hadoop常用命令集合
查看安全模式 bin/hadoop dfsadmin -safemode enter | leave | get | wait
- ubuntu中vim下按上下左右键时输入A、B、C、D的问题
ubuntu下使用vi 进行编辑文件时,按上下左右键时,会输入A.B.C.D,这个用起来很不方便.网上查得此问题的原因是: ubuntu系统自带的 vi 不完整导致,解决方法:安装完整的vi $ su ...
- vscode--搭建自动编译sass环境
一,安装插件及使用步骤 1.vscode安装Live Sass Compiler,由于该插件依赖Live Server ,所以会自动安装Live Server 2.点击vscode底部的Watch m ...
- 关于个人编辑器sublime text3使用指南
用过了好多编辑器,前些年用的zend studio,phpstorm近两年转为nodepad++(因为写的语言种类比较多了,shell,python,php,前端等),相对于nodepad++, s ...
- HDU 6097---Mindis(二分)
题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...
- NYOJ 252 01串(斐波那契数列变形)
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...