mysql和hive實現關聯查詢

最近有個需求就是要求實現傳統數據庫和大數據數據庫的關聯查詢。
剛開始的時候一頭霧水,感覺要實現這個需求很難,但是查了相關資料,漸漸了些思緒。
起初我想到的是想實現mysql和hive實現關聯查詢,hive和hbase是可以整合的,如果實現了這個也就實現了mysql和hbase的關聯查詢,開始的時候有了一個思路,就是利用sqoop將mysql的數據表導入到hive表中,或者將hive表的數據導入到mysql中,放到一個庫中再做關聯查詢,這個思路是肯定能實現的,但是總覺得這樣做很low,總感覺用這種方法實現有種投機取巧的感覺,於是我又查相關資料,有了另一種思路。
那就是,利用spark rdd,將mysql中的數據導入到一個spark的rdd中,將hive中的數據導入到spark的一個rdd中,兩個rdd之間實現關聯查詢,具體實現過程如下:
 1.在mysql準備數據
        create database mysql_db default character set utf8;
        剩下的可直接運行以下腳本:
mysql -uhive -phive -e "show databases;usemysql_db;
drop table if exists student;
CREATE TABLE student(sid int,sname VARCHAR(10),sage DATETIME,ssex CHAR(4));
INSERT INTO student VALUES(2 , '錢電' , '1990-12-21' , '男');
INSERT INTO student VALUES(3 , '孫風' , '1990-05-20' , '男');
INSERT INTO student VALUES(4 , '李雲' , '1990-08-06' , '男');
INSERT INTO student VALUES(5 , '周梅' , '1991-12-01' , '女');
INSERT INTO student VALUES(6 , '吳蘭' , '1992-03-01' , '女');
INSERT INTO student VALUES(7 , '鄭竹' , '1989-07-01' , '女');
INSERT INTO student VALUES(8 , '王菊' , '1990-01-20' , '女');
select * from student;"
 
     2.在hive上創建測試數據
beeline -u "jdbc:hive2://localhost:10000" -n hive -e  "show
databases;create database test;
use test;create table dept(id int,position string);
insert into dept select decode(binary('1'),'utf-8'),decode(binary('ceo'),'utf-8');
insert into dept select decode(binary('1'),'utf-8'),decode(binary('保安'),'utf-8');
insert into dept select decode(binary('3'),'utf-8'),decode(binary('保潔'),'utf-8');
insert into dept select decode(binary('4'),'utf-8'),decode(binary('會計'),'utf-8');
insert into dept select decode(binary('5'),'utf-8'),decode(binary('員工'),'utf-8');
insert into dept select decode(binary('6'),'utf-8'),decode(binary('員工'),'utf-8');
insert into dept select decode(binary('7'),'utf-8'),decode(binary('前臺'),'utf-8');
insert into dept select decode(binary('8'),'utf-8'),decode(binary('律師'),'utf-8'); "
 
     3.在spark rdd中導入mysql數據
      切換用戶到hive,否則沒權限
        a.spark-shell --master=local[4] --driver-class-path=/usr/lib/spark/lib/mysql-connector-java-5.1.35-bin.jar
b.執行以下代碼
import org.apache.spark.sql.SQLContext
  val sqlContext = new SQLContext(sc)
  import sqlContext.implicits._
        val prop = new java.util.Properties
        prop.put("user","hive")
        prop.put("password","hive")
         valmysql_db_rdd=sqlContext.read.jdbc("jdbc:mysql://172.17.201.134:3306/mysql_db","student",prop)
         mysql_db_rdd.show
 
     4.在spark rdd中導入hive數據
val hive_db_rdd=sqlContext.sql("select * from test.dept")         hive_db_rdd.foreach(t=>println("id"+t(0)+":"+t(1)))
        
     5.實現關聯操作(join操作)
     mysql_db_rdd.join(hive_db_rdd, $"sid" === $"id", "left").show
    
  mysql_db_rdd.join(hive_db_rdd, $"sid" === $"id", "right").show
 
  mysql_db_rdd.join(hive_db_rdd).collect
越來越spark感興趣了,確實比hive效率快多了
 
發佈了28 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章