Iskra は、Apache Spark API を中心とした Scala 3 ラッパー ライブラリで、タイプセーフでボイラープレートフリーでありながら効率的な Spark コードを作成できます。
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 は、 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"
または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
セクションの最新バージョンについては、ここを参照してください。