大白話講解Spark中的RDD
資料中:
Spark 中最基本的資料抽象是 RDD。
RDD:彈性分散式資料集 (Resilient Distributed DataSet)。
RDD的三個特性:分割槽,不可變,並行操作。
• RDD 是 Spark 的最基本抽象,是對分散式記憶體的抽象使用,實現了以操作本地集合的方式
來 操作分散式資料集的抽象實現
• RDD 是 Spark 最核心的東西,它表示已被分割槽,不可變的並能 夠被並行操作的資料集合,
不同的資料集格式對應不同的 RDD 實現
RDD特點:
• RDD 必須是可序列化的
• 只讀:狀態不可變,不能修改
• 分割槽:支援元素根據 Key 來分割槽( Partitioning ) ,儲存到多個結點上
• RDD 需要從其他資料集變換而來
• RDD 包含轉換與Action操作
• 對於不同的系統RDD不同,如HadoopRDD,JDBCRDD…
一臉懵逼 有沒有?
在學習spark中的知識點的時候,發現總是經常把dataframe或者dataset轉化成RDD,就很奇怪為什麼要做這方面的轉化,RDD又是何方神聖呢?
如果你熟悉資料庫,那麼RDD從表現形式上講最類似於資料庫的檢視(View)
去除這個RDD在物理結構上的特色,單從邏輯上的表現來說,他就是一個資料集合。
什麼是資料集合?
可以理解為Java中的一個list,或者是資料庫裡的一張表(或者檢視)等等。
既然是一張表,我們可以理解Spark對RDD的操作,其實類似於SQL裡面對錶的一些操作。
在最開始的時候我說RDD最類似資料庫的檢視,那為什麼是檢視而不是表呢?
這就要說說RDD裡面的這個R(彈性),什麼叫彈性呢?
就是一個RDD的資料並不一定是物理上真是存在的,注意是不一定,就像資料庫裡的檢視(view),只有你在query的時候他才會真正計算出這些資料。RDD裡的資料也一樣,
比如一張全是大寫地名的表-- {S: SHANGHAI, BEIJING, ...},可能在RDD裡是這樣一種形式 {S = S1:{Shanghai, BEIJing, ...}. toUPPERcase }.
前面提到的兩個數集合在物理上的內容其實是不一樣的,但是你能看到的兩個集合是一樣的。在Spark裡面,類似於toUPPERcase 這樣的操作我們叫運算元。好了,這樣你就理解了這個R,也是RDD最難懂的一個地方。再說說中間的那個D(分散式),這個很好理解,就是一個資料集分別放在幾個機器上,而RDD只要儲存這些資料的元資訊(如那一片在哪個機器上)即可。
不過這樣解釋似乎缺了些什麼,就是為什麼RDD要如此麻煩呢?
這裡我說最明顯的兩個亮點。
1,容錯:
比如你有一個表,裡面是一個公司12個月的平均銷售額,儲存在12個機器上,突然儲存8月資料的機器壞了,那麼你通常選擇的做法是把整一年的銷售資料拿出來,再以月份分組,再把8月的算出來,存在一個好的機器裡。而RDD儲存8月的資料可能就是(select avg(sales)from t where month = 8) ,在你需要的時侯,如果發現8月資料不在了,可以自動從原資料裡把這個資料恢復出來。(這個例子並不是特別真實,只不過很簡單的幫你理解容錯這個特性)。
2,是執行效率優化。假設有這麼一個情況,有一個資料表,先把裡面的資料都+1,再-1,再+1,再-1. 這樣顯然資料應該都是不變的。如果你每次都把這個資料表都算出來,這樣就要執行4次O(n)效率的查詢。然而用RDD的思路,{S'} = {S}+1-1+1-1 => {S'} = {s} + 0, 這樣就大大提高了效率。(同樣這個例子很弱智,但是能幫助你理解RDD為什麼要用資料+運算元的形式去描述一個資料集).
若要深入瞭解還需要結合Spark的執行機制,Hadoop的HDFS,Scala的語法共同來理解RDD這樣東西
總結:RDD就是一個虛擬的、分割槽的、可並行操作的具有容錯率高,執行優化效率高的資料集。
相關文章
- 大白話講解Mybatis的plugin(Interceptor)的使用MyBatisPlugin
- Spark RDD使用詳解--RDD原理Spark
- 大白話講解Promise(二)理解Promise規範Promise
- Spark RDD在Spark中的地位和作用如何?Spark
- 你不知道的JavaScript--Item34 大白話講解PromiseJavaScriptPromise
- Spark RDD中Runtime流程解析Spark
- 用大白話講Java動態代理的原理Java
- Spark RDD APISparkAPI
- spark-RDDSpark
- Spark SQL中的RDD與DataFrame轉換SparkSQL
- Spark 的核心概念 RDDSpark
- 大白話講解呼叫Redis的increment失敗原因及推薦使用RedisREM
- 基於RDD的Spark應用程式開發案列講解(詞頻統計)Spark
- Spark - [03] RDD概述Spark
- 理解JVM,大白話解釋JVM
- Spark RDD的預設分割槽數:(spark 2.1.0)Spark
- Spark Basic RDD 操作示例Spark
- 大白話JavaAgentJava
- Spark RDD詳解 | RDD特性、lineage、快取、checkpoint、依賴關係Spark快取
- 關於Spark中RDD的設計的一些分析Spark
- Spark開發-spark執行原理和RDDSpark
- SparkSQL /DataFrame /Spark RDD誰快?SparkSQL
- Spark RDD 特徵及其依賴Spark特徵
- spark學習筆記--RDDSpark筆記
- Calcite 使用原生的RDD 處理SparkSpark
- Spark(十三) Spark效能調優之RDD持久化Spark持久化
- Spark學習(二)——RDD基礎Spark
- 【大資料】Spark RDD基礎大資料Spark
- spark RDD,reduceByKey vs groupByKeySpark
- spark常用RDD介紹及DemoSpark
- spark RDD textFile運算元 分割槽數量詳解Spark
- 大白話Swift入門Swift
- ChatGPT 大白話 SmartIDEChatGPTIDE
- Spark運算元:統計RDD分割槽中的元素及數量Spark
- spark: RDD與DataFrame之間的相互轉換Spark
- Spark從入門到放棄---RDDSpark
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- RDD程式設計 上(Spark自學三)程式設計Spark