Iskra เป็นไลบรารี wrapper Scala 3 รอบ ๆ Apache Spark API ซึ่งอนุญาตให้เขียนโค้ด Spark ที่ปลอดภัยและไม่ต้องสำเร็จรูป แต่ยังคงมีประสิทธิภาพ
เริ่มตั้งแต่การเปิดตัว 3.2.0 Spark ได้รับการคอมไพล์แบบข้ามสำหรับ Scala 2.13 ซึ่งเปิดทางให้ใช้ Spark จากโค้ด Scala 3 เนื่องจากโปรเจ็กต์ Scala 3 สามารถพึ่งพาอาร์ติแฟกต์ Scala 2.13 ได้
อย่างไรก็ตาม อาจประสบปัญหาเมื่อพยายามเรียกใช้เมธอดที่ต้องการอินสแตนซ์โดยนัยของประเภท Encoder
ของ Spark การได้มาของอินสแตนซ์ของ Encoder
ขึ้นอยู่กับการมี TypeTag
สำหรับประเภทที่กำหนด อย่างไรก็ตาม TypeTag
จะไม่ถูกสร้างโดยคอมไพเลอร์ Scala 3 อีกต่อไป (และไม่มีแผนที่จะรองรับสิ่งนี้) ดังนั้นอินสแตนซ์ของ Encoder
จึงไม่สามารถสังเคราะห์ได้โดยอัตโนมัติในกรณีส่วนใหญ่
Iskra พยายามแก้ไขปัญหานี้โดยใช้ตัวเข้ารหัสของตัวเอง (ไม่เกี่ยวข้องกับประเภท Encoder
ของ Spark) ที่สร้างขึ้นโดยใช้ API การเขียนโปรแกรมเมตาใหม่ของ Scala 3
Iskra ให้ wrappers แบบบาง (แต่พิมพ์ยาก) รอบ ๆ DataFrame
ซึ่งจะติดตามประเภทและชื่อของคอลัมน์ ณ เวลาคอมไพล์ แต่ปล่อยให้ Catalyst ดำเนินการปรับให้เหมาะสมทั้งหมด ณ รันไทม์
Iskra ใช้ประเภทโครงสร้างแทนที่จะเป็นคลาสเคสเป็นโมเดลข้อมูล ซึ่งให้ความยืดหยุ่นอย่างมาก (ไม่จำเป็นต้องกำหนดคลาสเคสใหม่อย่างชัดเจนเมื่อมีการเพิ่ม/ลบ/เปลี่ยนชื่อคอลัมน์!) แต่เรายังคงได้รับข้อผิดพลาดในการคอมไพล์เมื่อเราพยายาม อ้างถึงคอลัมน์ที่ไม่มีอยู่หรือไม่สามารถใช้ได้ในบริบทที่กำหนด
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
ในโครงการ 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()
toTypedDF
บน Seq
ของคลาสเคส เช่น Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
ด้วยพารามิเตอร์ type ที่แสดงถึงคลาสเคส เช่น df.typed[ Foo ]
ในกรณีที่คุณต้องการกลับไปสู่โลกที่ไม่ปลอดภัยของเฟรมข้อมูลที่ไม่ได้พิมพ์ด้วยเหตุผลบางประการ เพียงเรียก .untyped
บนเฟรมข้อมูลที่พิมพ์
ไลบรารีนี้ตั้งใจที่จะมีลักษณะคล้ายกับ API ดั้งเดิมของ Spark มากที่สุด (เช่น โดยใช้ชื่อวิธีการเดียวกัน ฯลฯ) เมื่อเป็นไปได้ แม้ว่าจะพยายามทำให้โค้ดรู้สึกเหมือน Scala ทั่วไปมากขึ้นโดยไม่ต้องมีต้นแบบที่ไม่จำเป็น และเพิ่มการปรับปรุงวากยสัมพันธ์อื่น ๆ
ความแตกต่างที่สำคัญที่สุด:
$.foo.bar
แทน $"foo.bar"
หรือ col("foo.bar")
ใช้ backticks เมื่อจำเป็น เช่น $.`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
เวอร์ชันล่าสุด โปรดดูที่นี่