知识点1:建立关联Hbase的Hive表java
知识点2:Spark访问Hivesql
知识点3:Spark访问与Hbase关联的Hive表apache
知识点1:建立关联Hbase的Hive表app
两种方式建立,内部表和外部表oop
内部表,若是删除hive表,hbase表也会删除;不建议使用这种方式,大多数都是关联进行查询操做性能
外部表,若是删除hive表,hbase表不受影响;spa
hive使用的仍是存储在hbase中的数据。code
这里建立外部表。blog
CREATE EXTERNAL TABLE tdatafromhbase(key string, id string, info map<STRING,STRING> )
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf1:id, cf2:")
TBLPROPERTIES("hbase.table.name" = "userinfo");hadoop
Hbase中的表名为userinfo;
Hive中的表名为tdatafromhbase,字段为key, id, info<>;
因为在使用hbase的时候列名会不少且未知,这里使用了map数据类型存储列族cf2的内容。针对已知的列名能够直接指定,这里id就是列族cf1的字段id;
知识点2:spark访问hive
import org.apache.spark.sql.hive.HiveContext import org.apache.spark.{SparkContext, SparkConf} /** * Created by Edward on 2017/9/19. */ object HiveSql { def main(args: Array[String]) { val conf = new SparkConf().setAppName("sql-hive") val sc =new SparkContext(conf) val hiveContext = new HiveContext(sc) hiveContext.sql("select key, id, info from tdatafromhbase").collect().foreach(println) sc.stop() } }
知识点3:Spark访问与Hbase关联的Hive表
直接调用hive没什么差异,须要注意的就是,须要引用jar包,否则会报错
2017-10-03 01:55:36,817 ERROR [main] hive.log: error in initSerDe: java.lang.ClassNotFoundException Class org.apache.hadoop.hive.hbase.HBaseSerDe not found
java.lang.ClassNotFoundException: Class org.apache.hadoop.hive.hbase.HBaseSerDe not found
在spark-submit的时候添加参数,使用hive的库hive-hbase-handler-1.1.0-cdh5.10.0.jar
--jars /home/hadoop/app/hive-1.1.0-cdh5.10.0/lib/hive-hbase-handler-1.1.0-cdh5.10.0.jar
应用场景,spark操做hive,固然spark也能够直接操做hbase, 这里使用spark经过hive访问hbase,有点绕。
根据本身的实际需求,和性能要求进行调整。