使用SparkSql向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()
}
}
好了,本期内容就到这里了哦,小编会继续更新博客。各位的点赞、关注就是小编坚持下去的动力。
我是小哪吒,互联网行业的业余选手~~~ 哈哈,我们下期见哦
一切成就都缘于一个梦想和毫无根据的自信。 |