Spark SQL編程實戰案例

             Spark SQL編程實戰案例html

                                     做者:尹正傑sql

版權聲明:原創做品,謝絕轉載!不然將追究法律責任。apache

 

 

 

一.Spark SQL編程之DataFrame篇編程

  博主推薦閱讀:
    https://www.cnblogs.com/yinzhengjie2020/p/13193293.html

 

二.Spark SQL編程之DataSetjson

  博主推薦閱讀:
    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 ~]# 
[root@hadoop101.yinzhengjie.org.cn ~]# vim /tmp/user.json        #建立測試數據
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
相關文章
相關標籤/搜索