瞭解Spark SQL,DataFrame和資料集
阿新 • • 發佈:2019-02-14
關於Datasets和DataFrame API存在很多混淆,因此在本文中,我們將瞭解Spark SQL,DataFrames和Datasets。
Spark SQL
它是一個用於結構化資料處理的Spark模組,它允許您編寫更少的程式碼來完成工作,並且在底層,它可以智慧地執行優化。Spark SQL模組由兩個主要部分組成。我們將僅討論本文的第一部分,它是結構API的表示,稱為DataFrames和Datasets,它們定義了用於處理結構化資料的高階API。
Spark SQL模組的一個很酷的功能是能夠執行SQL查詢來執行資料處理,查詢的結果將作為資料集或資料框返回。Spark SQL模組可以輕鬆讀取資料並從以下任何格式寫入資料; CSV,XML和JSON以及二進位制資料的常見格式是Avro,Parquet和ORC。
DataFrames
資料框是一個分散式的資料集合,它按行組織,每行包含一組列,每列都有一個名稱和一個關聯的型別。換句話說,這個分布式資料集合具有由模式定義的結構。您可以將它視為關係資料庫中的表,但在引擎蓋下,它具有更豐富的優化。
與RDD一樣,DataFrame提供兩種型別的操作:轉換和操作
對轉換進行了延遲評估,並且熱切地評估了操作。
建立DataFrame
有幾種方法可以建立DataFrame; 其中一個常見的事情是需要隱式或顯式地提供模式。
以下程式碼將完全使用Spark 2.x和Scala 2.11
從RDD建立DataFrame
val rdd = sc。並行化(1 到 10)。map(x =>(x,x * x))
val dataframe = spark。createDataFrame(rdd)。toDF(“key”,“sqaure”)
資料幀。show()
//輸出:
+ --- + ----- +
| 關鍵| 價值|
+ --- + ----- +
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
| 6 | 36 |
| 7 | 49 |
| 8 | 64 |
| 9 | 81 |
| 10 | 100 |
+ --- + ----- +
資料集
資料集是一種強型別,不可變的資料集合。與DataFrame類似,資料集中的資料對映到定義的模式。它更多的是關於型別安全性並且是面向物件的。
DataFrame和資料集之間存在一些重要差異。
- 資料集中的每一行都由使用者定義的物件表示,以便您可以將單個列稱為該物件的成員變數。這為您提供了編譯型別的安全性。
- 資料集具有稱為編碼器的幫助器,它是智慧且高效的編碼實用程式,可將每個使用者定義物件內的資料轉換為緊湊的二進位制格式。如果資料集快取在記憶體中,以及在混洗過程中Spark需要通過網路傳輸的位元組數減少,這可以減少記憶體使用量。
建立資料集
有幾種方法可以建立資料集:
- 第一種方法是使用DataFrame類的as(Symbol)函式將DataFrame轉換為資料集。
- 第二種方法是使用SparkSession.createDataset()函式從本地物件集合建立資料集。
- 第三種方法是使用toDS隱式轉換實用程式。
讓我們看看建立資料集的不同方法
//使用SparkSession.createDataset()和toDS建立資料集
val movies = Seq(電影(“DDLJ”,“Awesome”,2018L), 電影(“ADHM”,“Nice”,2018L))
val moviesDS = spark。createDataset(localMovies)
電影DS。show()
val moviesDS1 = localMovies。toDS()
localMoviesDS1。show()
//為案例類建立編碼器
case class Employee(name:String,age:Long)
val caseClassDS = Seq(Employee(“Amy”,32))。TODS
caseClassDS。show()
//將DataFrame轉換為強型別資料集
案例 類 電影(ACTOR_NAME:字串,MOVIE_TITLE:字串,produced_year:龍)
val movies = Seq((“Damon,Matt”,“The Bourne Ultimatum”,2007L),
(“達蒙,馬特”,“善意狩獵”,1997L))
val moviesDF = 電影。toDF。作為 [ 電影 ]
感謝您閱讀本文,希望對您有所幫助。