Iskra adalah pustaka pembungkus Scala 3 di sekitar Apache Spark API yang memungkinkan penulisan kode Spark yang aman untuk mengetik dan bebas boilerplate namun tetap efisien.
Mulai dari rilis 3.2.0, Spark juga dikompilasi silang untuk Scala 2.13, yang membuka cara untuk menggunakan Spark dari kode Scala 3, karena proyek Scala 3 dapat bergantung pada artefak Scala 2.13.
Namun, seseorang mungkin mengalami masalah saat mencoba memanggil metode yang memerlukan instance implisit dari tipe Encoder
Spark. Derivasi instance Encoder
bergantung pada keberadaan TypeTag
untuk tipe tertentu. Namun TypeTag
s tidak lagi dihasilkan oleh kompiler Scala 3 (dan tidak ada rencana untuk mendukung ini) sehingga instance Encoder
tidak dapat disintesis secara otomatis dalam banyak kasus.
Iskra mencoba mengatasi masalah ini dengan menggunakan encodernya sendiri (tidak terkait dengan tipe Encoder
Spark) yang dihasilkan menggunakan API metaprogramming baru Scala 3.
Iskra menyediakan pembungkus tipis (tapi sangat diketik) di sekitar DataFrame
s, yang melacak jenis dan nama kolom pada waktu kompilasi tetapi membiarkan Catalyst melakukan semua optimasinya saat runtime.
Iskra menggunakan tipe struktural daripada kelas kasus sebagai model data, yang memberi kita banyak fleksibilitas (tidak perlu secara eksplisit mendefinisikan kelas kasus baru ketika kolom ditambahkan/dihapus/diganti namanya!) tetapi kita masih mendapatkan kesalahan kompilasi ketika kita mencoba untuk merujuk ke kolom yang tidak ada atau tidak dapat digunakan dalam konteks tertentu.
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
dalam proyek sbt: libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
Iskra dibuat dengan Scala 3.1.3 sehingga kompatibel dengan Scala 3.1.x dan rilis minor yang lebih baru (mulai dari 3.2.0 Anda akan mendapatkan penyelesaian kode untuk nama kolom di REPL dan Metals!). Iskra secara transitif bergantung pada Spark 3.2.0.
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
toTypedDF
pada Seq
kelas kasus, misalnya Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
di dalamnya dengan parameter tipe yang mewakili kelas kasus, misalnya df.typed[ Foo ]
Jika Anda perlu kembali ke dunia bingkai data yang tidak diketik karena alasan tertentu, panggil saja .untyped
pada bingkai data yang diketik.
Pustaka ini bermaksud untuk menyerupai API asli Spark secara maksimal (misalnya dengan menggunakan nama metode yang sama, dll.) jika memungkinkan, meskipun mencoba membuat kode terasa lebih seperti Scala biasa tanpa boilerplate yang tidak perlu dan menambahkan beberapa perbaikan sintaksis lainnya.
Perbedaan terpenting:
$.foo.bar
alih-alih $"foo.bar"
atau col("foo.bar")
. Gunakan backtick bila diperlukan, misalnya $.`column with spaces`
..select(...)
atau .select{...}
Anda harus mengembalikan sesuatu yang berupa kolom bernama atau tupel kolom bernama. Karena cara kerja sintaksis Scala, Anda dapat menulis secara sederhana .select($.x, $.y)
alih-alih select(($.x, $.y))
. Dengan kurung kurawal, Anda dapat menghitung nilai antara seperti .select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
dan bars
secara otomatis disimpulkan Proyek ini dibangun menggunakan scala-cli jadi gunakan saja perintah tradisional dengan .
sebagai root seperti scala-cli compile .
atau scala-cli test .
.
Untuk versi yang lebih baru dari bagian Usage
, lihat di sini