1. 程式人生 > >BigData進階--細說RDD,DataFrame,Dataset的區別

BigData進階--細說RDD,DataFrame,Dataset的區別

          在spark中有重要的元件SparkContext和SQLContext,在讀取資料檔案時我們可以通過這兩個元件進行不同形式的讀取,比如:

val conf = new SparkConf().setMaster("local").setAppName("testRead")
val sc = new SparkContext(conf)

val readFile = sc.textFile("C:\\Users\\Desktop\\part-00006")
      這種方式就是使用SparkContext進行檔案讀取,通過該種方式,我們可以讀取普通的文字檔案(無後綴名),.txt檔案。而使用SQLContext讀取的檔案格式較多,分別如下:
val conf = new SparkConf().setMaster("local").setAppName("testRead")
val sc = new SparkContext(conf)
val ssc = new SQLContext(sc)
ssc.read.text()    //文字檔案(包括txt檔案和無副檔名的文字檔案)
ssc.read.parquet()  //一種大資料檔案,儲存內容和格式都與文字檔案一致;
ssc.read.json()  //讀取json檔案或者json字串
        無論使用上述哪種方式去讀取檔案,我們都可以得到期望的資料集,但是兩種讀取方式的結果集型別卻是不同,因此結果集的具體操作也就不同,如下圖:

         通過上面圖我們可以清楚的看到兩種方式的結果集分別是RDD[T]和DataFrame,接下來就跟隨小編一起來看它們之間的區別;

 No1.以Person實體為例探究RDD和DataFrame

          當我們以兩種不同的方式讀取到Person資料,Person會作為RDD的型別引數,但是Spark無法知曉內部結構,而dataFrame可以清楚載入到Person實體的內部結果和具體的資料:

        RDD雖然以Person為型別引數,但是Spark框架並不瞭解Person類的內部結構;右側的DataFrame卻提供了詳細的結構資訊,使得Spark Sql可以清楚地知道資料集中有哪些列,每列的名稱和型別分別是什麼。

     DataFrame中多了資料集的結構資訊即Schema,所以我們在獲取到DataFrame結果集之後可以通過printSchema方法來檢視當前資料檔案的結構資訊。所以我們可以這樣理解,RDD是分散式的Java物件集合(這也就是為什麼RDD會有Broadcast廣播變數的方法),DataFrame是分散式的Row物件的集合。

     DataFrame除了提供比RDD更豐富的運算元之外,更重要的特點是提升執行效率、減少資料讀取以及執行計劃的優化。

No2.DataSet和DataFrame的對比

        DataSet可以理解成DataFrame的一種特例,主要區別是DataSet每一個record儲存的是一個強型別值而不是一個Row。

      DataFrame和DataSet可以相互轉化,df.as[ElementType]這樣可以把DataFrame轉化為DataSet,ds.toDF()這樣可以把DataSet轉化為DataFrame。

No3.區別

✎.RDD:

    不支援SparkSql操作 RDD一般和spark mlib同時使用

✎.DataFrame:

1. 與RDD和Dataset不同,DataFrame每一行的型別固定為Row,只有通過解析才能獲取各個欄位的值,無法直接獲取每一列的值:
testDF.foreach{
  line =>
    val col1=line.getAs[String]("col1")
    val col2=line.getAs[String]("col2")

}
     2. DataFrame和DataSet均支援SparkSql的操作,比如select,groupby之類的,還能註冊臨時表、進行sql語句操作
dataDF.createOrReplaceTempView("tmp")

spark.sql("select  ROW,DATE from tmp where DATE is not null order by DATE").show(100,false)
3. DataFrame和DataSet支援一些方便的儲存方式,比如儲存成csv,可以帶上表頭,這樣每一列的欄位名一目瞭然:
//儲存
val saveoptions = Map("header" -> "true", "delimiter" -> "\t", "path" -> "hdfs://172.xx.xx.xx:9000/test")
datawDF.write.format("com.databricks.spark.csv").mode(SaveMode.Overwrite).options(saveoptions).save()
//讀取
val options = Map("header" -> "true", "delimiter" -> "\t", "path" -> "hdfs://172.xx.xx.xx:9000/test")
val datarDF= spark.read.options(options).format("com.databricks.spark.csv").load()

✎.DataSet與DataFrame

1. DataFrame也可以叫做DataSet[Row],每一行的型別都是Row,不解析我們就無法知曉其中有哪些欄位,每個欄位又是什麼型別。我們只能通過getAs[型別]或者row(i)的方式來獲取特定的欄位內容      2. 而在Dataset中,每一行的型別是不一定的,在自定義了case class之後就可以很自由的獲取每一行的資訊
case class Coltest(col1:String,col2:Int)extends Serializable //定義欄位名和型別
/**
  rdd
   ("a", 1)
  ("b", 1)
  ("a", 1)
  * */
    val test: Dataset[Coltest]=rdd.map{line=>
      Coltest(line._1,line._2)
    }.toDS
    test.map{
      line=>
        println(line.col1)
        println(line.col2)
    }
        到此為止,三者的區別就講完了,在資料處理過程中,小編很少用到DataSet,處理文字檔案使用第一種讀取方式比較多,第二種讀取方式一般用來讀取parquet。




相關推薦

BigData--細說RDDDataFrameDataset區別

          在spark中有重要的元件SparkContext和SQLContext,在讀取資料檔案時我們可以通過這兩個元件進行不同形式的讀取,比如: val conf = new SparkConf().setMaster("local").setAppName

Spark RDDDataFrameDataSet區別和聯絡

左側的RDD[Person]雖然以Person為型別引數,但Spark框架本身不瞭解Person類的內部結構。而右側的DataFrame卻提供了詳細的結構資訊,使得Spark SQL可以清楚地知道該資料集中包含哪些列,每列的名稱和型別各是什麼。DataFrame多了資料的結構資訊,即schema。RDD是分散

Java面向對象篇(包裝類不可變類)

public 不存在 內存空間 test 都是 style system 覆蓋 位置 一. Java 8的包裝類 Java中的8種基本數據類型不支持面向對象的變成機制,也不具備對象的特性:沒有成員變量,方法可以調用。為此,Java為這8 種基本數據類型分別提供

瘋狂講義Activiti6.X工作流與項目實戰Activiti整合Drools

邊界 進階 活動 boot 搭建 網關 框架 組件 工作流 01 Activiti介紹與搭建開發環境 02 運行官方例子03 編寫第一個Activiti程序 04 流程引擎配置與服務組件05 Activiti數據庫介紹06 API(1)Activiti數據查詢07 API(

程序員的之路有難題怎麽辦?

彈性 方式 第一次 共享 實驗環境 華為 線上 二階 程序 拿程序員來說,想要在進階之路上成功完成以下三次飛躍,期間如果不加強自身的技術能力,就只能停滯不前。 第一次是進入公司,成為一顆專業的螺絲釘;第二次是技術水平突飛猛進,成為項目的頂梁柱;第三次是代碼寫作一馬當先,成為

「前端」完全吃透Promise深入JavaScript非同步

完全吃透Promise Promise晉級,需要的全部都在這 主要內容: promise基本實現原理 promise 使用中難點(鏈式呼叫,API基本上返回都是一個新Promise,及引數傳遞) promise 對異常處理 pr

Pod控制器應用四(Pod更新擴縮容)

vim deploy-demo.yaml [[email protected] test]# cat deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy name

JMeter深入性能測試體系接口性能測試各領域企業實戰

處理器 www 寫入 百分比 隨機化 創建數據庫 path multi 博客 jmeter是apache公司基於java開發的一款開源壓力測試工具,體積小,功能全,使用方便,是一個比較輕量級的測試工具,使用起來非常簡單。因為jmeter是java開發的,所以運行的時候必須先

程式設計師的之路有難題怎麼辦?

拿程式設計師來說,想要在進階之路上成功完成以下三次飛躍,期間如果不加強自身的技術能力,就只能停滯不前。 第一次是進入公司,成為一顆專業的螺絲釘; 第二次是技術水平突飛猛進,成為專案的頂樑柱; 第三次是程式碼寫作一馬當先,成為業界的佼佼者 下面,我們來看下小王的故事。 程式猿進階需求急

若想為軟體架構師這10本書必須讀!

軟體架構已經成為每一個軟體專案的重要組成部分,在構建可靠的軟體體系結構時,明確該系統最重要的組成部分,考慮這些部分如何組合在一起,並在設計這些系統時做出關鍵決策,是任何軟體開發專案的基礎 。   高階開發人員和軟體架構師之間是存在巨大差異的 。作為架構師,你需要有更多的經驗才能設計

Python基礎(8):python中的特性篇(迭代列表生成式生成器迭代器)

python中還包括一些高階特性,以下簡單介紹。 迭代 定義:用for迴圈來遍歷物件的過程,叫做迭代。 作用物件:可迭代物件 如何判斷是否為可迭代物件:isinstance(xxx,Iterable),Iterable型別來源於collections模組。 應用場景: 1

【Python+selenium】篇:js注入沒有我click不到節點

經常寫指令碼的你,偶爾會碰到一些比較煩人的情況就是,明明選到了元素但是click就是沒有反應,可能的情況有以下幾種: 1.沒錯,你就是選錯元素了,對,是你自己的原因; 2.有其它的元素層給擋住了,比如隔壁元素的透明外邊框,當然這種問題正常點就點不到; 3.python操作瀏覽器時可能

v-for——元件中使用時注意繫結key作為指定區分

原因:對於已經渲染過的頁面元素,Vue預設使用“就地複用的原則”,不會移動DOM元素來匹配資料 注意: 1.作為key,一定時唯一的,並且需要被v-bind繫結 2.v-bind繫結的key屬性只能只用唯一的number或String 沒有綁定出現的問題: ke

毛毛Python之路3——程序程序多開守護程序鎖!

毛毛Python進階之路3——程序,程序多開,守護程序,鎖! 話說在寫進階2 雙端互動的時候已經用到了程序多開socketserver。但那個僅僅侷限在雙端互動的時候,所以現在寫的是啥時兒都可以。妥妥的,安排,安排…… 【一個程式至少有一個程序,一個程序至少有一個執行緒!】

指標(修改過了按老師要求)

程式一 計算最長的字串長度:輸入n (n<10)個字串,輸出其中最長字串的有效長度。要求自定義函式 Int max_len ( char *s[],int n),用於計算有n個元素的指標陣列s中最長的字串的長度。 #include<stdio.h> #include&l

職場的10種姿勢你是哪一種呢?

除了埋頭苦幹,你的職場晉升之路還剩下哪些優勢? 這個世界充滿假象,唯有痛苦從不說謊! 職場如戰場,本就是優勝劣汰適者生存,只會埋頭苦幹的人,不過算是機械式運作的流水線工人,做得再多,再努力認真,也不過是生產力較高的的優秀的機械式員工。 簡言之,誰敢指望一頭只會低頭幹活,

JS的學習筆記(函式物件)

1.JS的Array物件 2.js的獲取日期時間方法 1.js與java的比較 3.js的Math方法 方法: 屬性: 4.js的全域性函式 5

Elasticsearch之高亮-高效能高亮器 讓Elasticsearch飛一會兒

package org.elasticsearch.search.highlight; import com.google.common.collect.Maps; import org.apache.lucene.search.highlight.*; import org.apache.lucene.s

Java之IO流篇:記憶體流列印流物件流

Java中的IO流,即為輸入輸出流。所謂輸入輸出流,都是相對於程式而言,程式就是這個參照物。一張圖看懂輸入輸出流:     輸入流抽象基類:InputStream,Reader   輸出流抽象基類:OutputStream,Writer   輸入輸出流子類眾多,詳情見下圖:    1.記

產品總監|突破晉升瓶頸實現3-5年產品經理的完美

產品總監是個專家崗+管理崗的職位,戰略能力是產品總監和產品經理最大的區別。一個偏向規劃,一個偏向執行。 每一個工作三五年的產品經理都渴望未來成為產品總監,然而能如期順利成為產品總監的人微乎其微,畢竟坑少人多。 為了提升自己的競爭力,是時候停下來給自己充充電了,唯有學習才能戰勝對手。 突破