spark hbase
来源:互联网 发布:iphone看txt软件 编辑:程序博客网 时间:2024/05/17 20:50
HBase 的 CRUD 操作
新版 API 中加入了 Connection,HAdmin成了Admin,HTable成了Table,而Admin和Table只能通过Connection获得。Connection的创建是个重量级的操作,由于Connection是线程安全的,所以推荐使用单例,其工厂方法需要一个HBaseConfiguration。
val conf = HBaseConfiguration.create()conf.set("hbase.zookeeper.property.clientPort", "2181")conf.set("hbase.zookeeper.quorum", "master")//Connection 的创建是个重量级的工作,线程安全,是操作hbase的入口val conn = ConnectionFactory.createConnection(conf)
创建表
使用Admin创建和删除表
val userTable = TableName.valueOf("user")//创建 user 表val tableDescr = new HTableDescriptor(userTable)tableDescr.addFamily(new HColumnDescriptor("basic".getBytes))println("Creating table `user`. ")if (admin.tableExists(userTable)) { admin.disableTable(userTable) admin.deleteTable(userTable)}admin.createTable(tableDescr)println("Done!")
插入、查询、扫描、删除操作
HBase 上的操作都需要先创建一个操作对象Put,Get,Delete等,然后调用Table上的相对应的方法
try{ //获取 user 表 val table = conn.getTable(userTable) try{ //准备插入一条 key 为 id001 的数据 val p = new Put("id001".getBytes) //为put操作指定 column 和 value (以前的 put.add 方法被弃用了) p.addColumn("basic".getBytes,"name".getBytes, "wuchong".getBytes) //提交 table.put(p) //查询某条数据 val g = new Get("id001".getBytes) val result = table.get(g) val value = Bytes.toString(result.getValue("basic".getBytes,"name".getBytes)) println("GET id001 :"+value) //扫描数据 val s = new Scan() s.addColumn("basic".getBytes,"name".getBytes) val scanner = table.getScanner(s) try{ for(r <- scanner){ println("Found row: "+r) println("Found value: "+Bytes.toString( r.getValue("basic".getBytes,"name".getBytes))) } }finally { //确保scanner关闭 scanner.close() } //删除某条数据,操作方式与 Put 类似 val d = new Delete("id001".getBytes) d.addColumn("basic".getBytes,"name".getBytes) table.delete(d) }finally { if(table != null) table.close() }}finally { conn.close()}
Spark 操作 HBase
首先要向 HBase 写入数据,我们需要用到PairRDDFunctions.saveAsHadoopDataset。因为 HBase 不是一个文件系统,所以saveAsHadoopFile方法没用。
def saveAsHadoopDataset(conf: JobConf): Unit
Output the RDD to any Hadoop-supported storage system, using a Hadoop JobConf object for that storage system
这个方法需要一个 JobConf 作为参数,类似于一个配置项,主要需要指定输出的格式和输出的表名。
Step 1:我们需要先创建一个 JobConf。
import org.apache.hadoop.hbase.mapred.TableOutputFormat//定义 HBase 的配置val conf = HBaseConfiguration.create()conf.set("hbase.zookeeper.property.clientPort", "2181")conf.set("hbase.zookeeper.quorum", "master")//指定输出格式和输出表名val jobConf = new JobConf(conf,this.getClass)jobConf.setOutputFormat(classOf[TableOutputFormat])jobConf.set(TableOutputFormat.OUTPUT_TABLE,"user")
Step 2: RDD 到表模式的映射
在 HBase 中的表 schema 一般是这样的:
row cf:col_1 cf:col_2
而在Spark中,我们操作的是RDD元组,比如(1,”lilei”,14), (2,”hanmei”,18)。我们需要将RDD[(uid:Int, name:String, age:Int)] 转换成 RDD[(ImmutableBytesWritable, Put)]。所以,我们定义一个 convert 函数做这个转换工作
def convert(triple: (Int, String, Int)) = { val p = new Put(Bytes.toBytes(triple._1)) p.addColumn(Bytes.toBytes("basic"),Bytes.toBytes("name"),Bytes.toBytes(triple._2)) p.addColumn(Bytes.toBytes("basic"),Bytes.toBytes("age"),Bytes.toBytes(triple._3)) (new ImmutableBytesWritable, p)}
Step 3: 读取RDD并转换
//read RDD data from somewhere and convertval rawData = List((1,"lilei",14), (2,"hanmei",18), (3,"someone",38))val localData = sc.parallelize(rawData).map(convert)
Step 4: 使用saveAsHadoopDataset方法写入HBase
localData.saveAsHadoopDataset(jobConf)
读取 HBase
Spark读取HBase,我们主要使用SparkContext 提供的newAPIHadoopRDDAPI将表的内容以 RDDs 的形式加载到 Spark 中。
val conf = HBaseConfiguration.create()conf.set("hbase.zookeeper.property.clientPort", "2181")conf.set("hbase.zookeeper.quorum", "master")//设置查询的表名conf.set(TableInputFormat.INPUT_TABLE, "user")val usersRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], classOf[org.apache.hadoop.hbase.client.Result])val count = usersRDD.count()println("Users RDD Count:" + count)usersRDD.cache()//遍历输出usersRDD.foreach{ case (_,result) => val key = Bytes.toInt(result.getRow) val name = Bytes.toString(result.getValue("basic".getBytes,"name".getBytes)) val age = Bytes.toInt(result.getValue("basic".getBytes,"age".getBytes)) println("Row key:"+key+" Name:"+name+" Age:"+age)}
- spark hbase
- spark hbase
- Spark&hbase
- spark hbase hbase-rdd
- Spark操作hbase
- spark 操作 hbase
- spark操作hbase
- Spark 连接 Hbase 配置
- spark操作hbase
- Spark操作Hbase
- spark&hbase integration
- spark streaming插入hbase
- spark sql读hbase
- spark 连接hbase
- spark操作hbase
- spark链接hbase
- spark访问hbase
- spark kafka hbase
- Ubuntu文件操作命令
- matlab画图
- 【iOS】 Label设置行距自适应高度
- gitolite服务器配置
- 第十四周 项目一分块查找
- spark hbase
- 凸包问题——圈水池
- IOS10 应用安装无网络访问,提示是否允许使用网络
- ORA-12526: TNS: 监听程序: 所有适用例程都处于受限模式
- Rxjava 和Retrofit资料的总结
- 计算广告系列篇(1)------定义
- 移动终端设计实验 实验5:数据存储实验
- 第十四周-项目二 二叉树排序树中查找的路径
- 公众号后台接口确认(让微信后台确认我们的后台是可用的)