1. 程式人生 > >SparkSQL JOIN 相關的自己看的筆記;

SparkSQL JOIN 相關的自己看的筆記;

背景:昨天[2016/1/27],TL說sparkSQL處理 join的時候不夠完美;

於是昨天開始在各類大資料相關網站查 join的方法,並且把Github上的原始碼下載後,開始閱讀,

今天(1/28),記錄一些學到的東西,加深記憶;

首先,join的使用 有兩種,我叫他 顯式和隱式;

隱式:

SELECTPersons.LastName, Persons.FirstName, Orders.OrderNo FROMPersons, Orders WHEREPersons.Id_P = Orders.Id_P; 顯式: SELECTPersons.LastName, Persons.FirstName, Orders.OrderNo
FROMPersons INNERJOINOrders ONPersons.Id_P = Orders.Id_P ORDERBYPersons.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
case "leftsemi"=>LeftSemi
如果無法匹配上述規則會丟擲 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)

   }

}

------------------------內容很雜,等到知識足夠豐富,整合到一起,總結------------------------------