sparksql DataSet和DataFrame

Dataset是分布式數(shù)據(jù)集合粒蜈。Dataset是Spark1.6新增的接口宴卖,用以提供RDDs(強類型等恐,有使用強大的lambda函數(shù)的能力)的優(yōu)點和Spark SQL的經(jīng)優(yōu)化的執(zhí)行引擎的優(yōu)點途样。Dataset可以從JVM對象進行構造并通過轉(zhuǎn)換函數(shù)(如map壹甥,flatmap,filter等)進行操作。DatasetAPI支持ScalaJava颁股。Python不支持Dataset API么库。但因為Python本身的動態(tài)性傻丝,DatasetAPI的許多優(yōu)點都已經(jīng)可用(比如甘有,你可以通過名字很自然的訪問一行的某一個字段,如row.columnName)葡缰,R的情況與此類似亏掀。

Dataset與RDD很像,不同的是它并不使用Java序列化或者Kryo泛释,而是使用特殊的編碼器來為網(wǎng)絡間的處理或傳輸?shù)膶ο筮M行序列化滤愕。對轉(zhuǎn)換一個對象為字節(jié)的過程來說編碼器和標準系列化器都是可靠的,編碼器的代碼是自動生成并且使用了一種格式怜校,這種格式允許Spark在不需要將字節(jié)解碼成對象的情況下執(zhí)行很多操作间影,如filtering、sorting和hashing等茄茁。

DataFrame是Dataset組織成列的數(shù)據(jù)集魂贬。它在概念上相當于關系型數(shù)據(jù)庫中的表,或者R/Python中的數(shù)據(jù)幀裙顽,但是在底層進行了更多的優(yōu)化付燥。DataFrames可以從多種數(shù)據(jù)源創(chuàng)建,例如:結構化數(shù)據(jù)文件愈犹、Hive中的表键科、外部數(shù)據(jù)庫或者已存在的RDDs。DataFrame API支持Scala漩怎、Java勋颖、Python和R。在Scala和Java中DataFrame其實是Dataset的RowS的形式的表示勋锤。在Scala API中牙言,DataFrame僅僅是Dataset[Row]的別名。但在Java中怪得,使用者需要使用Dataset來表示一個DataFrame咱枉。

但是 DataFrame 出來后發(fā)現(xiàn)有些情況下 RDD 可以表達的邏輯用 DataFrame 無法表達。比如 要對 group by 或 join 后的結果用自定義的函數(shù),可能用 SQL 是無法表達的徒恋。如下代碼:

case class ClassData(a: String, b: Int)

case class ClassNullableData(a: String, b: Integer)

val ds = Seq(ClassData("a", 1), ClassData("a", 2)).toDS()

val agged = ds.groupByKey(d => ClassNullableData(d.a, null))

.mapGroups {

case (key, values) => key.a + values.map(_.b).sum

}

中間處理過程的數(shù)據(jù)是自定義的類型,并且 groupby 后的聚合邏輯也是自定義的蚕断,故用 SQL 比較難以表達,所以提出了 Dataset API入挣。Dataset API 擴展 DataFrame API 支持靜態(tài)類型和運行已經(jīng)存在的 Scala 或 Java 語言的用戶自定義函數(shù)亿乳。同時 Dataset 也能享受 Spark SQL 里所有性能 帶來的提升。

Spark SQL的Scala接口支持自動的將一個包含case class的RDD轉(zhuǎn)換為DataFrame。這個case class定義了表結構葛假。Caseclass的參數(shù)名是通過反射機制讀取障陶,然后變成列名。Caseclass可以嵌套或者包含像Seq或Array之類的復雜類型聊训。這個RDD可以隱式的轉(zhuǎn)換為一個DataFrame抱究,然后被注冊為一張表。這個表可以隨后被SQL的statement使用带斑。

Spark SQL支持兩種將已存在的RDD轉(zhuǎn)化為Dataset的方法鼓寺。第一種方法使用反射推斷包含特定類型對象的RDD的結構。這種基于反射的方法代碼更加簡潔勋磕,并且當你在寫Spark程序的時候已經(jīng)知道RDD的結構的情況下效果很好妈候。

第二種創(chuàng)建Dataset的方法是通過編程接口建立一個結構,然后將它應用于一個存在的RDD挂滓。雖然這種方法更加繁瑣苦银,但它允許你在運行之前不知道其中的列和對應的類型的情況下構建Dataset。

DataFrame和DataSet可以相互轉(zhuǎn)化赶站,df.as[ElementType]這樣可以把DataFrame轉(zhuǎn)化為DataSet幔虏,ds.toDF()這樣可以把DataSet轉(zhuǎn)化為DataFrame。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亲怠,一起剝皮案震驚了整個濱河市所计,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌团秽,老刑警劉巖主胧,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異习勤,居然都是意外死亡踪栋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門图毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夷都,“玉大人,你說我怎么就攤上這事囤官。” “怎么了蛤虐?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵党饮,是天一觀的道長。 經(jīng)常有香客問我驳庭,道長刑顺,這世上最難降的妖魔是什么氯窍? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮蹲堂,結果婚禮上狼讨,老公的妹妹穿的比我還像新娘。我一直安慰自己柒竞,他們只是感情好政供,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著能犯,像睡著了一般鲫骗。 火紅的嫁衣襯著肌膚如雪犬耻。 梳的紋絲不亂的頭發(fā)上踩晶,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音枕磁,去河邊找鬼渡蜻。 笑死,一個胖子當著我的面吹牛计济,可吹牛的內(nèi)容都是我干的茸苇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼沦寂,長吁一口氣:“原來是場噩夢啊……” “哼学密!你這毒婦竟也來了?” 一聲冷哼從身側響起传藏,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腻暮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毯侦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哭靖,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年侈离,在試婚紗的時候發(fā)現(xiàn)自己被綠了试幽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡卦碾,死狀恐怖铺坞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洲胖,我是刑警寧澤济榨,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站宾濒,受9級特大地震影響腿短,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一橘忱、第九天 我趴在偏房一處隱蔽的房頂上張望赴魁。 院中可真熱鬧,春花似錦钝诚、人聲如沸颖御。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潘拱。三九已至,卻和暖如春拧略,著一層夾襖步出監(jiān)牢的瞬間芦岂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工垫蛆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽最,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓袱饭,卻偏偏與公主長得像川无,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虑乖,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容