1. 程式人生 > >Spark訪問與HBase關聯的Hive表

Spark訪問與HBase關聯的Hive表

刪除 sql 也會 影響 ron ble lec lang nbsp

知識點1:創建關聯Hbase的Hive表

知識點2:Spark訪問Hive

知識點3:Spark訪問與Hbase關聯的Hive表

知識點1:創建關聯Hbase的Hive表

兩種方式創建,內部表和外部表

內部表,如果刪除hive表,hbase表也會刪除;不建議使用這種方式,大多數都是關聯進行查詢操作

外部表,如果刪除hive表,hbase表不受影響;

hive使用的還是存儲在hbase中的數據。

這裏創建外部表。

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");

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,有點繞。

根據自己的實際需求,和性能要求進行調整。

Spark訪問與HBase關聯的Hive表