专栏首页Spark生态圈Spark整合HBase(自定义HBase DataSource)

Spark整合HBase(自定义HBase DataSource)

背景

Spark支持多种数据源,但是Spark对HBase 的读写都没有相对优雅的api,但spark和HBase整合的场景又比较多,故通过spark的DataSource API自己实现了一套比较方便操作HBase的API。

写 HBase

写HBase会根据Dataframe的schema写入对应数据类型的数据到Hbase,先上使用示例:

import spark.implicits._
import org.apache.hack.spark._
val df = spark.createDataset(Seq(("ufo",  "play"), ("yy",  ""))).toDF("name", "like")
// 方式一
val options = Map(
            "hbase.table.rowkey.field" -> "name",
            "hbase.table.numReg" -> "12",
            "hbase.table.rowkey.prefix" -> "00",
            "bulkload.enable" -> "false"
        )
df.saveToHbase("hbase_table", Some("XXX:2181"), options)
// 方式二
df1.write.format("org.apache.spark.sql.execution.datasources.hbase")
            .options(Map(
                "hbase.table.rowkey.field" -> "name",
                "hbase.table.name" -> "hbase_table",
                "hbase.zookeeper.quorum" -> "XXX:2181",
                "hbase.table.rowkey.prefix" -> "00",
                "hbase.table.numReg" -> "12",
                "bulkload.enable" -> "false"
            )).save()

上面两种方式实现的效果是一样的,下面解释一下每个参数的含义:

  • hbase.zookeeper.quorum:zookeeper地址
  • hbase.table.rowkey.field:spark临时表的哪个字段作为hbase的rowkey,默认第一个字段
  • bulkload.enable:是否启动bulkload,默认不启动,当要插入的hbase表只有一列rowkey时,必需启动
  • hbase.table.name:Hbase表名
  • hbase.table.family:列族名,默认info
  • hbase.table.startKey:预分区开始key,当hbase表不存在时,会自动创建Hbase表,不带一下三个参数则只有一个分区
  • hbase.table.endKey:预分区开始key
  • hbase.table.numReg:分区个数
  • hbase.table.rowkey.prefix: 当rowkey是数字开头,预分区需要指明前缀的formate形式,如 00
  • hbase.check_table: 写入hbase表时,是否需要检查表是否存在,默认 false

读 HBase

示例代码如下:

// 方式一
import org.apache.hack.spark._
 val options = Map(
    "spark.table.schema" -> "appid:String,appstoreid:int,firm:String",
    "hbase.table.schema" -> ":rowkey,info:appStoreId,info:firm"
)
spark.hbaseTableAsDataFrame("hbase_table", Some("XXX:2181")).show(false)
// 方式二
spark.read.format("org.apache.spark.sql.execution.datasources.hbase").
            options(Map(
            "spark.table.schema" -> "appid:String,appstoreid:int,firm:String",
            "hbase.table.schema" -> ":rowkey,info:appStoreId,info:firm",
            "hbase.zookeeper.quorum" -> "XXX:2181",
            "hbase.table.name" -> "hbase_table"
        )).load.show(false)  

spark和hbase表的schema映射关系指定不是必须的,默认会生成rowkey和content两个字段,content是由所有字段组成的json字符串,可通过field.type.fieldname对单个字段设置数据类型,默认都是StringType。这样映射出来还得通过spark程序转一下才是你想要的样子,而且所有字段都会去扫描,相对来说不是特别高效。

故我们可自定义schema映射来获取数据:

  • hbase.zookeeper.quorum:zookeeper地址
  • spark.table.schema:Spark临时表对应的schema eg: "ID:String,appname:String,age:Int"
  • hbase.table.schema:Hbase表对应schema eg: ":rowkey,info:appname,info:age"
  • hbase.table.name:Hbase表名
  • spark.rowkey.view.name:rowkey对应的dataframe创建的tempview名(设置了该值后,只获取rowkey对应的数据)

注意这两个schema是一一对应的,Hbase只会扫描hbase.table.schema对应的列。

源码在我的 GitHub,欢迎star

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JPA 执行update/delete query 需要加上事务

    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Executing...

    一个会写诗的程序员
  • 第14章 使用Kotlin 进行 Android 开发(2)

    我们使用 fastjson 来解析这个数据。在 app 下面的 build.gradle中添加依赖

    一个会写诗的程序员
  • 第10章 使用 Kotlin 创建 DSL第10章 使用 Kotlin 创建 DSL

    使用DSL的编程风格,可以让程序更加简单干净、直观简洁。当然,我们也可以创建自己的 DSL。相对于传统的API, DSL 更加富有表现力、更符合人类语言习惯。

    一个会写诗的程序员
  • OpenBr快速入门 原

    这篇教程旨在使用一些有趣的例子让你熟悉OpenBR背后的思想、对象以及动机。注意需要摄像头的支持。

    Gaussic
  • 淘宝开放平台API开发(一) 原

           淘宝官方为应用开发者提供了一套很好的API,开发是只要调用它的API接口就可以获取相应的数据。笔者现正从事Java Web开发,因而就淘宝API调...

    Gaussic
  • 一个超长时间的http api 的 nginx 超时错误 java.io.IOException: unexpected end of stream on Connection一个长时间的http a

    直接访问IP是OK的。但是经过了中间一台域名机子,配置了nginx (基本上所有的超时时间timeout配置项都配置了足够的时间)的proxy_pass到这个...

    一个会写诗的程序员
  • 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )

    本小节,我们将 《精尽 Dubbo 源码解析》 和 《Dubbo 用户指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地...

    芋道源码
  • 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )

    本小节,我们将 《精尽 Dubbo 源码解析》 和 《Dubbo 用户指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地...

    芋道源码
  • 《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程第15章 Kotlin 文件IO操作与多线程《Kotlin极简教程》正式上架:

    我们在使用 Groovy 的文件 IO 操作的时候,感觉非常便利。同样的Kotlin也有好用的文件 IO 操作的 API。同样的在 Kotlin 中对 Java...

    一个会写诗的程序员
  • 使用 Spring HATEOAS 开发 REST 服务

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-SpringHATEOAS/

    Gaussic

扫码关注云+社区

领取腾讯云代金券