spark读取数据写入hbase

24 篇文章 2 订阅
该博客展示了如何通过Spark将数据写入HBase。首先,配置HBase的Zookeeper集群地址,然后创建HBase表,接着从Spark DataFrame读取数据,解析并以指定格式存储到HBase,最后通过Hadoop的TableOutputFormat将数据写入表中。示例代码中,以用户ID作为RowKey,并将省份和城市信息存储在列簇'cf'下。
摘要由CSDN通过智能技术生成
import com.hm.util.SparkHelper
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.{HColumnDescriptor, HTableDescriptor, TableName}
import org.apache.hadoop.hbase.client.{Admin, Connection, ConnectionFactory, Put}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.sql.{DataFrame, Row, SparkSession}

object toHbase {
  //spark读取数据写入Hbase测试
  def main(args: Array[String]): Unit = {
    //获取spark 入口
    val spark: SparkSession = SparkHelper.getSparkSession
    // 获取Hbase连接
    val config: Configuration = spark.sparkContext.hadoopConfiguration
    config.set("hbase.zookeeper.quorum", "mypc01:2181,mypc02:2181,mypc03:2181")
    //Construct a map/reduce job configuration.
    val jobConf = new JobConf(config)
    // 设置写入Hbase表的属性
    jobConf.setOutputFormat(classOf[TableOutputFormat])
    // 写入表的名称
    jobConf.set(TableOutputFormat.OUTPUT_TABLE, "test20")
    val connection: Connection = ConnectionFactory.createConnection(config)
    val admin: Admin = connection.getAdmin
    if (!admin.tableExists(TableName.valueOf("test20"))) {
      //创建表test20
      val tableDescriptor = new HTableDescriptor(TableName.valueOf("test20"))
      //设置列簇名称
      val cf = new HColumnDescriptor("cf")
      tableDescriptor.addFamily(cf)
      admin.createTable(tableDescriptor)
      connection.close()
    }
    // 读取数据
    val df: DataFrame = spark.read.load("output/rs")
    import spark.implicits._
    //解析数据并存入hbase
    df.rdd.map((x: Row) => {
      val userId: String = x.getAs[String]("imei")
      val pro: String = x.getAs[String]("provincename")
      val city: String = x.getAs[String]("cityname")
      //以userid作为rowkey
      val rowkey = new Put(userId.getBytes())
      //列簇名cd,列名2020,value pro+city
      rowkey.addImmutable("cf".getBytes(), "2020".getBytes(), (pro + "," + city).getBytes())
      (new ImmutableBytesWritable(), rowkey)
    }).saveAsHadoopDataset(jobConf)
  }
}

之后可以登录hbase查看数据

hbase(main):026:0> scan 'default:test20'

结果示例,hbase中中文无法直接查看

8zs1l7q7e                             column=cf:2020, timestamp=1611142156451, value=\xE6\xB9\x96\xE5\x8D\x97\xE7\x9C\x81,\xE7\x9B\x8A\xE9\x98\xB3\xE5\x
                                        B8\x82
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值