SparkSQL JOIN 相關的自己看的筆記;
背景:昨天[2016/1/27],TL說sparkSQL處理 join的時候不夠完美;
於是昨天開始在各類大資料相關網站查 join的方法,並且把Github上的原始碼下載後,開始閱讀,
今天(1/28),記錄一些學到的東西,加深記憶;
首先,join的使用 有兩種,我叫他 顯式和隱式;
隱式:
SELECT
Persons.LastName,
Persons.FirstName, Orders.OrderNo
FROM
Persons,
Orders
WHERE
Persons.Id_P
= Orders.Id_P;
顯式:
SELECT
Persons.LastName,
Persons.FirstName, Orders.OrderNo
FROM
Persons
INNER
JOIN
Orders
ON
Persons.Id_P
= Orders.Id_P
ORDER
BY
Persons.LastName;
大資料處理的資料是分散在各地server上的表所以 join表是無法避免的,這一點和traditional db 還是有區別的;
-------具體Github上的原始碼分析,我會在週末更新----------------------------
下班前,更新:
到目前,Github 最新版的spark stable version是1.6.0;
首先是 spark-shell 展示給我們的頁面:src location:org.apache.spark.rep-》SparkILoop.scala
程式碼很清晰,應該不用解釋;
Join的type(在sql目錄下的catalyst /plan下) 現在已經細分 可分為:INNER, LEFTOUTER, RIGHTOUTER,FULLOUTER,LEFT SEMI;
join-type 的選取是根據模式匹配,匹配字串,具體規則為
@requires_authorization
case "inner"=>Inner case "outer" |"full" | "fullouter"=>FullOuter case "leftouter" | "left"=>LeftOuter case "rightouter" | "right"=>RightOuter如果無法匹配上述規則會丟擲 IllegAlargumentException
---------------------今天到此,每天時間不多,-----------------------------------------
先分析下原始碼中sql module 的結構;
sql module 分為 catalyst,core,hive 和hive-thrift server;
catalyst 功能為 一個用於agnostic 的框架,可以管理 關係符河語句;
core 功能:去 翻譯 catalyst 的query語句 並執行;query 語句的 execute engine,將邏輯的sql語句轉換為RDD ;
hive: 主要的function 類為 hive-context the extention of sql-context;主要功能是實現hive QL ;
hive-thriftserver: it's the support of the HiveQL;
-------------------第一個 API 誕生------------------------------------------------
第一步,安裝spark,具體過程official為準,因為spark安裝一直在小改,改到越來越好裝;
第二步,寫API,建議用scala,java畢竟太囉嗦,僅個人觀點,檔案結構如下;
Admins-MacBook-Pro-88:test **8$ find .
.
./**.sbt
./src
./src/main
./src/main/scala
./src/main/scala/***.scala
利用 sbt 打包;
最後,就可用spark-submit 執行 測試了, 整個過程很簡單,但是初次接觸弄了一天;
當submit時,如果在機器上撞了Hadoop,編寫API時,檔案路徑必須加file://,如果預設的話會以hdfs匹配;
而且,submit檢索的起始目錄為使用者的根目錄,而不是當前所在目錄或者是spark根目錄;
-----------------第一個 SparkSQL application 誕生--------------------------------------------
SQL支援的檔案很多有 txt,jason parquet 等等;
程式碼在下面貼出,主要遇到的問題有
1. scala version 問題,配置sbt配置檔案時scala的version 為配置spark時的scala 版本而不是本機自己安裝的scala 版本;
忘記scala version 可以type spark-shell on cmd
terminal 啟動spark的過程會有 spark 標誌出現,緊接著就回發現scala版本;
2. case 類 要寫到主類外面,寫在main裡面會出現 無法識別 .doDF方法的 exception;
/********SparkSQL TEST APP***********/
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
case class Person(name:String, age:Int)
object teenagers{
def main(args: Array[String]){
val conf = new SparkConf().setAppName("SQL Application")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
val people = sc.textFile("file:///Users/xjin/Downloads/spark-1.6.0-bin-hadoop2.6/examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0),p(1).trim.toInt)).toDF()
people.registerTempTable("people")
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
}
}
------------------------內容很雜,等到知識足夠豐富,整合到一起,總結------------------------------