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

前言

學(xué)習(xí)Spark源代碼的過程中遇到了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)化過的,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中,可以分成兩類,“無類型(untyped)”的DataFrame API和“類型化(typed)”的Dataset API。
確切的說Dataframe并不是”無類型”的, 它們有類型,只是類型檢查沒有那么嚴(yán)格,只檢查這些類型是否在 ==運(yùn)行時(shí)(run-time)== 與schema中指定的類型對(duì)齊。
而Dataset在 ==編譯時(shí)(compile-time)== 就會(huì)檢查類型是否符合規(guī)范。

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

關(guān)于不同語言中的可用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沒有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

簡單來說,如果轉(zhuǎn)換是弱類型的,它將返回一個(gè)Dataframe(==確切的說弱類型轉(zhuǎn)換的返回類型還有 Column, RelationalGroupedDataset, DataFrameNaFunctionsDataFrameStatFunctions 等==),而強(qiáng)類型轉(zhuǎn)換返回的是一個(gè)Dataset。
在源代碼中,我們可以看到弱類型轉(zhuǎn)換API的返回類型是Dataframe而不是Dataset,且?guī)в?code>@group untypedrel的注釋。 因此,我們可以通過檢查該方法的簽名來確定它是否是弱類型的(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容