關(guān)于Spark Dataset API中的Typed transformations和Untyped transformations

前言

學(xué)習(xí)Spark源代碼的過(guò)程中遇到了Typed transformations和Untyped transformations兩個(gè)概念版述,整理了以下相關(guān)的筆記酝静。
對(duì)于這兩個(gè)概念涝影,不知道怎么翻譯好危号,個(gè)人理解為強(qiáng)類型轉(zhuǎn)換和弱類型轉(zhuǎn)換隘马,也不知道對(duì)不對(duì)逞姿,歡迎各位大神指正乔妈。

關(guān)于Dataset

Dataset是特定領(lǐng)域?qū)ο?domain-specific object)的強(qiáng)類型集合蝙云,它可以使用函數(shù)或關(guān)系運(yùn)算進(jìn)行并行轉(zhuǎn)換。 每個(gè)Dataset還有一個(gè)名為DataFrame的弱類型視圖路召,相當(dāng)于Dataset[Row]勃刨。
對(duì)于Spark(Scala),DataFrames只是類型為Row的Dataset股淡。 “Row”類型是Spark中用于計(jì)算的身隐,優(yōu)化過(guò)的,in-memory的一種內(nèi)部表達(dá)唯灵。

Dataset上可用的操作分為 轉(zhuǎn)換(transformation)執(zhí)行(action) 兩種抡医。

  • Transformation操作可以產(chǎn)生新的Dataset,如map,filter忌傻,select和aggregate(groupBy)等大脉。
  • Action操作觸發(fā)計(jì)算和返回結(jié)果。 如count水孩,show或?qū)懭胛募到y(tǒng)等镰矿。

關(guān)于Dataset API

Typed and Un-typed APIs

實(shí)質(zhì)上,在Saprk的結(jié)構(gòu)化API中俘种,可以分成兩類秤标,“無(wú)類型(untyped)”的DataFrame API和“類型化(typed)”的Dataset API。
確切的說(shuō)Dataframe并不是”無(wú)類型”的, 它們有類型宙刘,只是類型檢查沒(méi)有那么嚴(yán)格苍姜,只檢查這些類型是否在 ==運(yùn)行時(shí)(run-time)== 與schema中指定的類型對(duì)齊。
而Dataset在 ==編譯時(shí)(compile-time)== 就會(huì)檢查類型是否符合規(guī)范悬包。

Dataset API僅適用于 ==基于JVM的語(yǔ)言(Scala和Java)==衙猪。我們可以使用Scala 中的case class或Java bean來(lái)進(jìn)行類型指定。

關(guān)于不同語(yǔ)言中的可用API可參考下表布近。
<table class="table"><thead><tr><th>Language</th>
<th>Main Abstraction</th>
</tr></thead><tbody><tr><td>Scala</td>
<td>Dataset[T] & DataFrame (alias for Dataset[Row])</td>
</tr><tr><td>Java</td>
<td>Dataset[T]</td>
</tr><tr><td>Python</td>
<td>DataFrame</td>
</tr><tr><td>R
</td>
<td>DataFrame</td>
</tr></tbody></table>

由于Python和R沒(méi)有compile-time type-safety垫释,因此只有 Untyped API,即DataFrames撑瞧。

關(guān)于Transformations

轉(zhuǎn)換(transformation)可以被分為:

  • 強(qiáng)類型轉(zhuǎn)換(Typed transformations)
  • 弱類型轉(zhuǎn)換(Untyped transformations)

Typed transformations vs Untyped transformations

簡(jiǎn)單來(lái)說(shuō)棵譬,如果轉(zhuǎn)換是弱類型的,它將返回一個(gè)Dataframe(==確切的說(shuō)弱類型轉(zhuǎn)換的返回類型還有 Column, RelationalGroupedDataset, DataFrameNaFunctionsDataFrameStatFunctions 等==)预伺,而強(qiáng)類型轉(zhuǎn)換返回的是一個(gè)Dataset订咸。
在源代碼中,我們可以看到弱類型轉(zhuǎn)換API的返回類型是Dataframe而不是Dataset酬诀,且?guī)в?code>@group untypedrel的注釋算谈。 因此,我們可以通過(guò)檢查該方法的簽名來(lái)確定它是否是弱類型的(untyped)料滥。

強(qiáng)類型轉(zhuǎn)換API帶有@group typedrel的注釋

例如Dataset.scala類中的join方法就屬于弱類型轉(zhuǎn)換(untyped transformations).

  /**
   * Join with another `DataFrame`.
   *
   * Behaves as an INNER JOIN and requires a subsequent join predicate.
   *
   * @param right Right side of the join operation.
   *
   * @group untypedrel
   * @since 2.0.0
   */
  def join(right: Dataset[_]): DataFrame = withPlan {
    Join(logicalPlan, right.logicalPlan, joinType = Inner, None, JoinHint.NONE)
  }

總結(jié)

通常然眼,任何更改Dataset列類型或添加新列的的轉(zhuǎn)換是弱類型。 當(dāng)我們需要修改Dataset的schema時(shí)葵腹,我們就需要退回到Dataframe進(jìn)行操作高每。

參考資料

Structured API Overview
Difference-between-Typed-and-untyped-transformation-in-dataset-API
RDDs vs DataFrames and Datasets
spark-sql-dataset-operators
org.apache.spark.sql.Dataset

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市践宴,隨后出現(xiàn)的幾起案子鲸匿,更是在濱河造成了極大的恐慌,老刑警劉巖阻肩,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带欢,死亡現(xiàn)場(chǎng)離奇詭異运授,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乔煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門吁朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人渡贾,你說(shuō)我怎么就攤上這事逗宜。” “怎么了空骚?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵纺讲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我囤屹,道長(zhǎng)熬甚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任肋坚,我火速辦了婚禮乡括,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冲簿。我一直安慰自己,他們只是感情好亿昏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布峦剔。 她就那樣靜靜地躺著,像睡著了一般角钩。 火紅的嫁衣襯著肌膚如雪吝沫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天递礼,我揣著相機(jī)與錄音惨险,去河邊找鬼。 笑死脊髓,一個(gè)胖子當(dāng)著我的面吹牛辫愉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播将硝,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恭朗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了依疼?” 一聲冷哼從身側(cè)響起痰腮,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎律罢,沒(méi)想到半個(gè)月后膀值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年沧踏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歌逢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悦冀,死狀恐怖趋翻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒蟆,我是刑警寧澤踏烙,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站历等,受9級(jí)特大地震影響讨惩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寒屯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一荐捻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寡夹,春花似錦处面、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至智绸,卻和暖如春野揪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧栗。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工斯稳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迹恐。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓挣惰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殴边。 傳聞我的和親對(duì)象是個(gè)殘疾皇子通熄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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