Spark SQL程式設計實戰案例

2022-09-15 18:51:12 字數 4105 閱讀 4120

spark sql程式設計實戰案例

一.spark sql程式設計之dataframe篇

博主推薦閱讀:

二.spark sql程式設計之dataset

博主推薦閱讀:

三.dataframe與dataset的互操作

[

[email protected] ~

]# vim /tmp/

user

.json

[[email protected] ~]#

[[email protected] ~

]# cat /tmp/

user

.json

[[email protected] ~

]#

[[email protected] ~]# vim /tmp/user.json        #建立測試資料

scala>

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>.共性

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程式

博主推薦閱讀:

SparkSQL 六 案例實戰

首先我們的資料來源如下 tbdate這張表記錄的是時間資訊 tbstockdetail這張表記錄的訂單的詳細資訊 tbstock這張表將訂單與實踐和地點兩個維度的資訊連線在一起。資料屬性如下 每個訂單可能包含多個貨品,每個訂單可以產生多次交易,不同的貨品有不同的單價。也就是說 tbstock與tbs...

SparkSQL 實戰應用

sparksql 實戰應用 資料集 movielens 1m datase users.dat userid gender age occupation zip code movies.dat movieid title genres ratings.dat userid movieid ratin...

Spark Sql之DataFrame實戰詳解

在spark 1.3新加的最重要的新特性之一dataframe的引入,很類似在r語言中的dataframe的操作,使得spark sql更穩定高效。1 dataframe簡介 在spark中,dataframe是一種以rdd為基礎的分布式資料據集,類似於傳統資料庫聽二維 dataframe帶有sch...