spark操作读取hbase实例

本文介绍了一个具体的Spark读取HBase数据的例子,通过代码展示了如何设置过滤器、配置扫描参数等步骤来高效地从HBase中获取所需数据。

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

博主项目实践中,经常需要用spark从hbase中读取数据。其中,spark的版本为1.6,hbase的版本为0.98。现在记录一下如何在spark中操作读取hbase中的数据。
对于这种操作型的需求,没有什么比直接上代码更简单明了的了。so,show me the code!

object Demo extends Logging{

  val CF_FOR_FAMILY_USER = Bytes.toBytes("U");
  val CF_FOR_FAMILY_DEVICE = Bytes.toBytes("D")
  val QF_FOR_MODEL = Bytes.toBytes("model")
  val HBASE_CLUSTER = "hbase://xxx/"
  val TABLE_NAME = "xxx";
  val HBASE_TABLE = HBASE_CLUSTER + TABLE_NAME

  def genData(sc:SparkContext) = {
    //20161229的数据,rowkey的设计为9999-yyyyMMdd
    val filter_of_1229 = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("79838770"))
    //得到qf为w:00-23的数据
    val filter_of_qf = new QualifierFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("w"))

    val all_filters = new util.ArrayList[Filter]()
    all_filters.add(filter_of_1229)
    all_filters.add(filter_of_qf)

	//hbase多个过滤器
    val filterList = new FilterList(all_filters)

    val scan = new Scan().addFamily(CF_FOR_FAMILY_USER)
    scan.setFilter(filterList)
    scan.setCaching(1000)
    scan.setCacheBlocks(false)

    val conf = HBaseConfiguration.create()
    conf.set(TableInputFormat.INPUT_TABLE,HBASE_TABLE )
    conf.set(TableInputFormat.SCAN, Base64.encodeBytes(ProtobufUtil.toScan(scan).toByteArray()))
       sc.newAPIHadoopRDD(conf,classOf[TableInputFormat],classOf[ImmutableBytesWritable],classOf[Result])
    //后面是针对hbase查询结果的具体业务逻辑
    .map()
    ...

  def main(args: Array[String]): Unit = {
    val Array(output_path) = args

    val sparkConf = new SparkConf().setAppName("demo")
    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val sc = new SparkContext(sparkConf)

	genUuidWifi(sc).saveAsTextFile(output_path)
	sc.stop()
  }
}

需要注意的一个小点就是如果hbase里有多个过滤器,注意需要使用FilterList。

### 使用 Spark 操作 HBase 数据的方法 #### 创建环境配置 为了使 SparkHBase 成功集成并操作数据,需先设置好相应的依赖库以及配置文件。这通常涉及到在项目中引入必要的 Maven 或 SBT 依赖项来加载 Spark-HBase 连接器。 #### 初始化连接上下文 建立到 HBase 的连接前,需要初始化一个能够访问 HBase 的 `Configuration` 对象实例,并将其传递给 SparkContext 来构建 RDD 或 DataFrame API 所需的数据源[^1]。 ```scala import org.apache.hadoop.hbase.HBaseConfiguration val conf = HBaseConfiguration.create() conf.set("hbase.zookeeper.quorum", "localhost") // 设置 Zookeeper 地址 ``` #### 构建 RDD 访问接口 利用上述配置对象,可以通过调用特定方法创建用于读取或写入 HBase 记录的 RDD 实例。对于读取而言,会返回由键值对组成的 RDD;而对于写入,则是将指定格式的数据集转化为适合存入 HBase 的形式后再执行批量插入操作[^3]。 ```scala // 导入隐式转换和其他必要包 import org.apache.spark.rdd.NewHadoopRDD import org.apache.hadoop.hbase.client.Result import org.apache.hadoop.hbase.io.ImmutableBytesWritable import org.apache.hadoop.hbase.mapreduce.TableInputFormat // 定义输入名 conf.set(TableInputFormat.INPUT_TABLE, "my_table") // 加载整个格作为 RDD[(ImmutableBytesWritable, Result)] val hbaseRdd = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result]) ``` #### 处理获取的结果集合 一旦获得了来自 HBase 的原始数据流 (即上面提到的 `hbaseRdd`) ,就可以应用各种变换函数来进行过滤、映射或其他任何形式的操作以满足具体业务需求。例如提取某些列族下的字段值或将多条记录聚合起来形成新的视图等。 ```scala // 假设我们只关心 'cf' 列族下名为 'qualifier' 的列 val filteredData = hbaseRdd.filter { case (_, result) => Option(result.getValue("cf".getBytes(), "qualifier".getBytes())) match { case Some(value) => true case None => false } } ``` #### 将处理后的数据保存回 HBase 当完成所有预期的数据加工流程之后,最终可能还需要把得到的新数据重新送回到 HBase 中去更新现有记录或是新增一批新纪录。此时可以借助于 `foreachPartition()` 方法配合 Put 请求实现高效的批量化提交过程。 ```scala filteredData.foreachPartition(partition => { val connection = ConnectionFactory.createConnection(conf) val table = connection.getTable(TableName.valueOf("output_table")) partition.foreach{case(_,result)=> val put=new Put(Bytes.toBytes(new String(result.getRow))) put.addColumn( Bytes.toBytes("cf"), Bytes.toBytes("new_qualifier"), Bytes.toBytes("some_value") ) table.put(put) } table.close() }) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值