Iskra는 형식이 안전하고 상용구가 필요하지 않지만 여전히 효율적인 Spark 코드를 작성할 수 있는 Apache Spark API를 기반으로 하는 Scala 3 래퍼 라이브러리입니다.
3.2.0 릴리스부터 Spark는 Scala 2.13용으로도 크로스 컴파일됩니다. 이는 Scala 3 프로젝트가 Scala 2.13 아티팩트에 의존할 수 있으므로 Scala 3 코드에서 Spark를 사용할 수 있는 방법을 열어줍니다.
그러나 Spark Encoder
유형의 암시적 인스턴스가 필요한 메서드를 호출하려고 하면 문제가 발생할 수 있습니다. Encoder
인스턴스의 파생은 지정된 유형에 대한 TypeTag
의 존재에 의존합니다. 그러나 TypeTag
는 더 이상 Scala 3 컴파일러에 의해 생성되지 않으므로(이를 지원할 계획도 없음) 대부분의 경우 Encoder
인스턴스가 자동으로 합성될 수 없습니다.
Iskra는 Scala 3의 새로운 메타프로그래밍 API를 사용하여 생성된 자체 인코더(Spark의 Encoder
유형과 관련 없음)를 사용하여 이 문제를 해결하려고 합니다.
Iskra는 컴파일 시간에 열의 유형과 이름을 추적하지만 Catalyst가 런타임에 모든 최적화를 수행하도록 하는 DataFrame
주변에 씬(그러나 강력한 유형의) 래퍼를 제공합니다.
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
호출하면 됩니다.
이 라이브러리는 불필요한 상용구 없이 코드를 일반 Scala와 비슷하게 만들고 다른 구문 개선 사항을 추가하면서 가능한 경우 Spark의 원본 API와 최대한 유사하도록 하려고 합니다(예: 동일한 메서드 이름 사용 등).
가장 중요한 차이점은 다음과 같습니다.
$"foo.bar"
또는 col("foo.bar")
대신 $.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
섹션을 보려면 여기를 확인하세요.