(原文地址:
http://blog.youkuaiyun.com/codemosi/article/category/2777045,转载麻烦带上原文地址。hadoop hive hbase mahout storm spark kafka flume,等连载中,做个爱分享的人
)

(hadoop1.0生态圈的BI系统。由hive作为大头提供分析接口,整合hbase,在hbase上存储小部分信息,由hive来分析hbase的小部分信息)
(hadoop2.0生态圈+spark的BI系统。在分析接口上由spark sql , hive ,spark协作提供分析接口,存储还是一样,hbase存储小部分信息,但是是由 spark直接访问hbase的数据。)
此文主要介绍2.0系统中的红圈部分,spark 如何分析 hbase的信息。还是一样,作为程序员应该直接看代码入手。代码就在spark的shell界面直接输入。不在scala文件写了。
import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor}
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.spark.rdd.NewHadoopRDD
import scala.collection.JavaConverters._
val conf = HBaseConfiguration.create() //Hbase访问配置
conf.set(TableInputFormat.INPUT_TABLE, "user") //访问Hbase的user表
var hBaseRDD = sc.newAPIHadoopRDD(conf, //sc 是spark shell界面的内置对象,表示spark的上下文。
classOf[TableInputFormat], // 使用Hbase的的参数格式
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], //
classOf[org.apache.hadoop.hbase.client.Result])// 返回值类型 最后解析返回值var hBaseRDD。这个RDD就可以来分析Hbase的user表了
hBaseRDD.count() //查出user表有几条记录
hBaseRDD.map(tuple => tuple._2) //
.map(result => result.getColumn("infos".getBytes(), "username".getBytes()))//
.map(keyValues => {
( keyValues.asScala.reduceLeft {
(a, b) => if (a.getTimestamp > b.getTimestamp) a else b
}.getRow,
keyValues.asScala.reduceLeft {
(a, b) => if (a.getTimestamp > b.getTimestamp) a else b
}.getValue
)
}
).take(5)
这个例子,用来取出HBase user表中的用户名username字段的值123456。其他的业务,使用spark的transformation结合程序的逻辑来处理hbaseRDD,来做各种业务逻辑和分析。if,groupby什么的。transformation见02篇。
user:大概表结构 如下
rowkey columeFamily:infos
colume :username colume:password
21121998 123456 123321