Spark SQL編程實戰案例html
做者:尹正傑sql
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。apache
一.Spark SQL編程之DataFrame篇編程
博主推薦閱讀: https://www.cnblogs.com/yinzhengjie2020/p/13193293.html
二.Spark SQL編程之DataSet篇json
博主推薦閱讀: https://www.cnblogs.com/yinzhengjie2020/p/13197064.html
三.DataFrame與DataSet的互操做vim
[root@hadoop101.yinzhengjie.org.cn ~]# vim /tmp/user.json [root@hadoop101.yinzhengjie.org.cn ~]# [root@hadoop101.yinzhengjie.org.cn ~]# cat /tmp/user.json {"name":"yinzhengjie","passwd":"2020"} {"name":"Jason","passwd":"666666"} {"name":"Liming","passwd":"123"} {"name":"Jenny","passwd":"456"} {"name":"Danny","passwd":"789"} [root@hadoop101.yinzhengjie.org.cn ~]#
scala> import spark.implicits._ #舒適提示,在執行下面的案例操做前,須要先導入隱式轉換喲~ import spark.implicits._ scala>
1>.DataFrame轉換爲DataSet緩存
scala> val df = spark.read.json("/tmp/user.json") #建立DataFrame df: org.apache.spark.sql.DataFrame = [name: string, passwd: string] scala> case class User(name: String, passwd: String) #建立樣例類 defined class User scala> val ds = df.as[User] #經過樣例類將DataFrame轉換爲DataSet ds: org.apache.spark.sql.Dataset[User] = [name: string, passwd: string] scala> ds.show +-----------+------+ | name|passwd| +-----------+------+ |yinzhengjie| 2020| | Jason|666666| | Liming| 123| | Jenny| 456| | Danny| 789| +-----------+------+ scala>
2>.DataSet轉換爲DataFrame數據結構
scala> ds #當前DataSet是上一個案例的對象 res11: org.apache.spark.sql.Dataset[User] = [name: string, passwd: string] scala> val df = ds.toDF #將DataSet轉換爲DataFrame df: org.apache.spark.sql.DataFrame = [name: string, passwd: string] scala> df.show +-----------+------+ | name|passwd| +-----------+------+ |yinzhengjie| 2020| | Jason|666666| | Liming| 123| | Jenny| 456| | Danny| 789| +-----------+------+ scala>
四.RDD,DataFrame和DataSet三者之間的關係分佈式
在SparkSQL中Spark爲咱們提供了兩個新的抽象,分別是DataFrame和DataSet。他們和RDD有什麼區別呢?首先從版本的產生上來看: RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)
若是一樣的數據都給到這三個數據結構,他們分別計算以後,都會給出相同的結果。不一樣是的他們的執行效率和執行方式。
在後期的Spark版本中,DataSet會逐步取代RDD和DataFrame成爲惟一的API接口。
1>.共性ide
RDD、DataFrame、Dataset全都是spark平臺下的分佈式彈性數據集,爲處理超大型數據提供便利
三者都有惰性機制,在進行建立、轉換,如map方法時,不會當即執行,只有在遇到Action如foreach時,三者纔會開始遍歷運算。
三者都會根據spark的內存狀況自動緩存運算,這樣即便數據量很大,也不用擔憂會內存溢出。
三者都有partition的概念
三者有許多共同的函數,如filter,排序等
在對DataFrame和Dataset進行操做許多操做都須要導入隱式轉換(import spark.implicits._)進行支持
DataFrame和Dataset都可使用模式匹配獲取各個字段的值和類型
2>.區別
RDD: RDD通常和spark mlib同時使用 RDD不支持sparksql操做 DataFrame: 與RDD和Dataset不一樣,DataFrame每一行的類型固定爲Row,每一列的值無法直接訪問,只有經過解析才能獲取各個字段的值 DataFrame與Dataset通常不與spark mlib同時使用 DataFrame與Dataset均支持sparksql的操做,好比select,groupby之類,還能註冊臨時表/視窗,進行sql語句操做 DataFrame與Dataset支持一些特別方便的保存方式,好比保存成csv,能夠帶上表頭,這樣每一列的字段名一目瞭然.利用這樣的保存方式,能夠方便的得到字段名和列的對應,並且分隔符(delimiter)能夠自由指定。 Dataset: Dataset和DataFrame擁有徹底相同的成員函數,區別只是每一行的數據類型不一樣。 DataFrame也能夠叫Dataset[Row],每一行的類型是Row,不解析,每一行究竟有哪些字段,各個字段又是什麼類型都無從得知,只能用上面提到的getAS方法或者共性中的第七條提到的模式匹配拿出特定字段。而Dataset中,每一行是什麼類型是不必定的,在自定義了case class以後能夠很自由的得到每一行的信息 Dataset在須要訪問列中的某個字段時是很是方便的,然而,若是要寫一些適配性很強的函數時,若是使用Dataset,行的類型又不肯定,多是各類case class,沒法實現適配,這時候用DataFrame即Dataset[Row]就能比較好的解決問題。
五.IDEA建立SparkSQL程序
博主推薦閱讀: https://www.cnblogs.com/yinzhengjie2020/p/13200300.html