Pyspark的HBaseConverters详解
来源:互联网 发布:厨房电器 知乎 编辑:程序博客网 时间:2024/05/22 13:48
作者: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详解
- pyspark-histogram详解
- pyspark-combineByKey详解
- pyspark-combineByKey详解
- pyspark的RDD运算
- pyspark的初始调用
- pyspark notebook的使用
- pyspark的pickle.PicklingError
- pyspark 遇到的问题
- pyspark
- pyspark 经常遇到的问题
- pyspark中like的用法
- 运行pyspark的avro的例子
- pyspark notebook中文显示问题的解决
- pyspark中使用自定义模块的问题
- pyspark的使用和操作(基础整理)
- [pyspark] pyspark使用记录
- 聚类(一)pyspark 实现特征的ID化
- springmvc+mybatis+maven整合(添加)
- Hbase1.0伪分布式集群启动失败问题
- Pyspark访问Hbase
- springMVC 框架搭建学习
- 实用教程|快速搭建自动导航机器人(三)
- Pyspark的HBaseConverters详解
- IPv4地址在mysql的存储
- 将博客搬至CSDN
- 神经网络回顾-Relu激活函数
- mysql计算时间差
- python +selenium 解决IE浏览器调用报错问题
- MongoDB 使用场景
- 软件设计--模块划分
- 训练一个简单的神经网络(基于CS231n)