1. 程式人生 > >如何理解spark中RDD和DataFrame的結構?

如何理解spark中RDD和DataFrame的結構?

RDD中可以儲存任何的單機型別的資料,但是,直接使用RDD在欄位需求明顯時,存在運算元難以複用的缺點。

例如,現在RDD存的資料是一個Person型別的資料,現在要求所有每個年齡段(10年一個年齡段)的人中最高的身高與最大的體重。

使用RDD介面,因為RDD不瞭解其中儲存的資料的具體結構,資料的結構對它而言是黑盒,於是這就需要使用者自己去寫一個很特化的聚合的函式來完成這樣的功能。

而有了DataFrame,則框架會去了解RDD中的資料是什麼樣的結構的,使用者可以說清楚自己對每一列進行什麼樣的操作,這樣就有可能可以實現一個運算元,用在多個列上,比較容易進行運算元的複用。甚至,未來又要同時求出每個年齡段內不同的姓氏有多少個,則使用RDD介面,之前的函式需要改動很大才能滿足需求,而使用DataFrame介面,則只需要新增對這一個列的處理,原來的max/min的相關列處理都可保持不變。

總而言之,DataFrame相關介面就是RDD的一個擴充套件,讓RDD瞭解了RDD中儲存的資料包含哪些列,並可以在列上進行操作。

另外,DataFrame基本上快要被Dataset介面取代了,你可以再去了解下Dataset介面。


作者:張雲聰
連結:https://www.zhihu.com/question/48684460/answer/112346482
來源:知乎

著作權歸作者所有,轉載請聯絡作者獲得授權。

作者:CyannyLiang
連結:https://www.zhihu.com/question/48684460/answer/123355450
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。

旅行中無意看到這個問題,最近的專案和spark dataframe相關,也來談談自己的理解啦
Spark RDD是分散式彈性資料集,一個比較核心的是粗粒度的分散式計算,粗粒度是指使用者不用關心太多的分散式細節,用宣告式的API就能完成分散式計算,比如Word Count用一行就能寫完。RDD易用性很好,那Spark為啥還要有Dataframe呢?
DataFrame的從API上借鑑了R和pandas的DataFRame的概念,是業界標準結化資料處理API。DataFrame的資料抽象是命名元組,程式碼裡是Row型別,Dataframe結合了過程化程式設計和聲名式的API,讓使用者能用過程化程式設計的方法處理結構化資料。
Dataframe比RDD多了限制,帶來了更多的優化,基於Spark Catalyst優化器,提供如列裁剪,謂詞下推,map join等優化。同時,採用code generation ,動態編譯表示式,提升效能,比用rdd的自定義函式效能高5倍左右。
舉個例子,
rdd.map(lambda line: line.split("\t"))
   .map(lambda items: (items[0], items[1], items[2], items[3]))
   .filter(lambda items: int(items[2]) >= 19)
   .select(lambda items: (items[0], items[1]))
sqlContext.table("people")
        .filter(col("age") >= 19)
        .select("id", "name")
用rdd讀結構化文字要用map函式,需要按位置獲取資料,沒有schema,效能和可讀性都不好。
而用dataframe可以直接通過sede讀取結構化資料,效能比RDD高2到3倍左右,比MR高5倍左右,同時,具有結構化的資料,可讀性更好。
DataFrame具有很好的易用性,支援多種語言,在一個上下文可以寫udf,具有部署一致性,以前寫HQL Transform的使用者可以試試Dataframe,在複雜統計分析中,有dataframe可以過程化程式設計,模組化會更好,可讀性強。
Dataframe可以用df.rdd等方式轉化為RDD,處理更多靈活的操作。

Spark2.0推出DataSet,是更加強型別的API,用了scala的泛型,能在編譯是發現更多的編譯問題DataFrame是DataSet〈Row〉型別,DS在介面上和DataFrame很相似。感覺是為了和structured streaming 統一做鋪墊。

另外,看到Apache Beam這個google的開源專案正在用flume java的API統一google cloud api ,spark和flink這個和bigflow很像。

從用過dataframe的同事反饋,dataframe的易用性、效能都挺好。