Iskra 是一個圍繞 Apache Spark API 的 Scala 3 包裝器庫,它允許編寫類型安全、無樣板但仍然高效的 Spark 程式碼。
從 3.2.0 版本開始,Spark 也針對 Scala 2.13 進行交叉編譯,這開啟了一種從 Scala 3 程式碼使用 Spark 的方法,因為 Scala 3 專案可以依賴 Scala 2.13 工件。
但是,當嘗試呼叫需要 Spark Encoder
類型的隱式實例的方法時,可能會遇到問題。 Encoder
實例的衍生依賴於給定類型的TypeTag
的存在。然而,Scala 3 編譯器不再產生TypeTag
(並且沒有計劃支援這一點),因此在大多數情況下無法自動合成Encoder
的實例。
Iskra 試圖透過使用自己的編碼器(與 Spark 的Encoder
類型無關)來解決這個問題,這些編碼器是使用 Scala 3 的新元程式設計 API 產生的。
Iskra 提供了圍繞DataFrame
的瘦(但強類型)包裝器,它在編譯時追蹤列的類型和名稱,但讓 Catalyst 在運行時執行所有最佳化。
Iskra 使用結構類型而不是案例類別作為資料模型,這為我們提供了很大的靈活性(在新增/刪除/重新命名列時無需明確定義新的案例類別!),但當我們嘗試引用不存在或無法在給定上下文中使用的列。
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
: libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
Iskra 是使用 Scala 3.1.3 建構的,因此它與 Scala 3.1.x 和更新的次要版本相容(從 3.2.0 開始,您將獲得 REPL 和 Metals 中列名稱的程式碼補全!)。 Iskra 間接依賴 Spark 3.2.0。
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
Seq
上使用toTypedDF
擴展方法,例如 Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
擴充方法,例如df.typed[ Foo ]
如果您因為某些原因需要返回非類型化資料幀的不安全世界,只需在類型化資料幀上呼叫.untyped
即可。
該程式庫旨在盡可能地最大程度地類似於Spark 的原始API(例如,透過使用相同的方法名稱等),儘管試圖使程式碼感覺更像常規Scala,而無需不必要的樣板檔案並添加一些其他語法改進。
最重要的區別:
$.foo.bar
而不是$"foo.bar"
或col("foo.bar")
來引用列(還帶有指定資料幀別名的前綴,以防歧義)。必要時使用反引號,例如$.`column with spaces`
。.select(...)
或.select{...}
內部,您應該傳回命名列或命名列元組的內容。由於 Scala 語法的工作原理,您可以簡單地編寫.select($.x, $.y)
而不是select(($.x, $.y))
。使用大括號,您可以計算中間值,例如.select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
和bars
的別名是自動推斷的該項目是使用 scala-cli 構建的,因此只需使用帶有.
像scala-cli compile .
或scala-cli test .
。
有關Usage
部分的最新版本,請參閱此處