一、Hive資料來源實戰
Spark SQL支援對Hive中儲存的資料進行讀寫。操作Hive中的資料時,必須建立HiveContext,而不是SQLContext。HiveContext繼承自SQLContext,但是增加了在Hive後設資料庫中查詢表,以及用HiveQL語法編寫SQL的功能。除了sql()方法,HiveContext還提供了hql()方法,從而用Hive語法來編譯sql。
使用HiveContext,可以執行Hive的大部分功能,包括建立表、往表裡匯入資料以及用SQL語句查詢表中的資料。查詢出來的資料是一個Row陣列。
將hive-site.xml拷貝到spark/conf目錄下,將mysql connector拷貝到spark/lib目錄下
HiveContext sqlContext = new HiveContext(sc);
sqlContext.sql("CREATE TABLE IF NOT EXISTS students (name STRING, age INT)");
sqlContext.sql("LOAD DATA LOCAL INPATH '/usr/local/spark-study/resources/students.txt' INTO TABLE students");
Row[] teenagers = sqlContext.sql("SELECT name, age FROM students WHERE age<=18").collect();
複製程式碼
二、 將資料儲存到表中
Spark SQL還允許將資料儲存到Hive表中。呼叫DataFrame的saveAsTable命令,即可將DataFrame中的資料儲存到Hive表中。與registerTempTable不同,saveAsTable是會將DataFrame中的資料物化到Hive表中的,而且還會在Hive後設資料庫中建立表的後設資料。
預設情況下,saveAsTable會建立一張Hive Managed Table,也就是說,資料的位置都是由後設資料庫中的資訊控制的。當Managed Table被刪除時,表中的資料也會一併被物理刪除。
registerTempTable只是註冊一個臨時的表,只要Spark Application重啟或者停止了,那麼表就沒了。而saveAsTable建立的是物化的表,無論Spark Application重啟或者停止,表都會一直存在。
呼叫HiveContext.table()方法,還可以直接針對Hive中的表,建立一個DataFrame。
案例:查詢分數大於80分的學生的完整資訊