使用SparkSql向Hbase中查询和插入数据

spark hbase工具类 查数据_spark hbase工具类 查数据


create ‘student’, ‘message’
 scan ‘student’, {COLUMNS => ‘message’}

给出以下数据,请使用spark将数据写入到hbase中的student表中,并进行查询出来

数据如下:

依次是:姓名 班级 性别 省份,对应表中的字段依次是:name,class,sex,province

飞松 3 女 山东省

刚洁 1 男 深圳市

格格 4 女 四川省

谷菱 5 女 河北省

国立 2 男 四川省

海涛 3 男 广东省

含芙 3 女 四川省

华敏 4 女 上海市

乐和 2 男 上海市

乐家 3 男 黑龙江

乐康 4 男 湖北省

乐人 5 男 四川省

乐水 3 男 北京市

乐天 4 男 河北省

乐童 5 男 江苏省

乐贤 1 男 陕西省

乐音 2 男 广东省

李仁 3 男 湖北省

立涛 3 女 陕西省

凌青 4 女 湖北省

陆涛 4 男 山东省

媚媚 5 女 河南省

梦亿 4 男 江苏省

铭忠 5 男 四川省

慕梅 3 女 北京市

鹏吉 1 男 上海市

娉婷 4 女 河南省

淇峰 2 男 广东省

庆元 3 男 上海市

庆滋 4 男 北京市

丘东 5 男 江苏省

荣郑 1 男 黑龙江

蕊蕊 5 女 四川省

尚凯 2 男 北京市

诗涵 1 女 河南省

淑凤 2 女 天津市

淑娇 3 女 上海市

淑燕 4 女 河北省

淑怡 4 女 广东省

思璇 2 女 湖北省

苏华 3 女 山东省

苏梅 4 女 四川省

听荷 5 女 深圳市

文怡 1 女 天津市

文怡 2 女 河北省

香凝 3 女 山东省

翔云 4 女 河南省

小芸 5 女 深圳市

package com.czxy.homeworkOne

import java.util.UUID

import org.apache.hadoop.hbase.{HBaseConfiguration, HColumnDescriptor, HTableDescriptor, TableName}
import org.apache.hadoop.hbase.client.{HBaseAdmin, Put, Result}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object demo30 {
  def main(args: Array[String]): Unit = {
    //1.设置Spark的运行环境
    val config = new SparkConf().setAppName("DataSourceTest").setMaster("local[*]")
    //2.创建spark的上下文对象, 与clusterManager进行通信。分配管理任务
    val sc = new SparkContext(config)
    //设置日志级别
    sc.setLogLevel("WARN")
    //
    //创建  HBase所需的环境配置
    val conf = HBaseConfiguration.create()
    //设置连接
    conf.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181")
    //设置需要操作的表
    val studentTable = TableName.valueOf("student")
    //获取表的描述
    val tableDescr = new HTableDescriptor(studentTable)
    //添加列族
    tableDescr.addFamily(new HColumnDescriptor("message".getBytes))

    //创建Hbase的管理对象
    val admin = new HBaseAdmin(conf)
    //如果表已存在就先禁用表,然后删除表
    if (admin.tableExists(studentTable)) {
      admin.disableTable(studentTable)
      admin.deleteTable(studentTable)
    }
    //创建表
    admin.createTable(tableDescr)

    //给列族添加列
    def convert(triple: (String, String, String,String)) = {

      val put = new Put(Bytes.toBytes(UUID.randomUUID().toString.substring(0,8)))
      put.addImmutable(Bytes.toBytes("message"), Bytes.toBytes("name"), Bytes.toBytes(triple._1))
      put.addImmutable(Bytes.toBytes("message"), Bytes.toBytes("classes"), Bytes.toBytes(triple._2))
      put.addImmutable(Bytes.toBytes("message"), Bytes.toBytes("sex"), Bytes.toBytes(triple._3))
      put.addImmutable(Bytes.toBytes("message"), Bytes.toBytes("address"), Bytes.toBytes(triple._4))
      (new ImmutableBytesWritable, put)
    }
    //准备一批数据添加到表中
    //    val dataRDD: RDD[(String, String, String)] = sc.parallelize(List(("1","apple","11"), ("2","banana","12"), ("3","pear","13")))
    val rdd30: RDD[Array[String]] = sc.textFile("info").map(_.split("\t"))

    val list: List[List[(String, String, String, String)]] = rdd30.map(x => List((x(0), x(1), x(2), x(3)))).collect().toList
    val flatten: List[(String, String, String, String)] = list.flatten
    val dataRDD: RDD[(String, String, String, String)] = sc.parallelize(flatten)

    val targetRDD: RDD[(ImmutableBytesWritable, Put)] = dataRDD.map(convert)

    //构造一个map/reduce得作业配置
    val jobConf = new JobConf(conf)
    //设置mapreduce 的输出位置
    jobConf.setOutputFormat(classOf[TableOutputFormat])
    jobConf.set(TableOutputFormat.OUTPUT_TABLE, "student")

    //使用Hadoop JobConf对象将RDD输出到任何Hadoop支持的存储系统
    targetRDD.saveAsHadoopDataset(jobConf)
    println("写入数据成功")

    //读取数据
    conf.set(TableInputFormat.INPUT_TABLE, "student")
    //使用InputFormat获取给定Hadoop文件的RDD
    //和传递到输入格式的额外配置选项。
    val hbaseRDD: RDD[(ImmutableBytesWritable, Result)] = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
      classOf[org.apache.hadoop.hbase.client.Result])

    //返回rdd的数量
    val count: Long = hbaseRDD.count()
    println("hBaseRDD RDD Count:"+ count)
    //遍历查询表中的数据
    hbaseRDD.foreach {
      case (_, result) =>
        val key = Bytes.toString(result.getRow)
       val name = Bytes.toString(result.getValue("message".getBytes, "name".getBytes))
        val classes = Bytes.toString(result.getValue("message".getBytes, "classes".getBytes))
        val sex = Bytes.toString(result.getValue("message".getBytes, "sex".getBytes))
        val address = Bytes.toString(result.getValue("message".getBytes, "address".getBytes))
        println("Row key:" + key + ", Name:" + name + ", class:" + classes+", sex:"+sex+", address:"+address)
    }
    sc.stop()
  }


}

好了,本期内容就到这里了哦,小编会继续更新博客。各位的点赞、关注就是小编坚持下去的动力。

我是小哪吒,互联网行业的业余选手~~~ 哈哈,我们下期见哦

一切成就都缘于一个梦想和毫无根据的自信。