2
tryParquet
関数は、ParquetファイルからDatasetを読み込もうとします。そうでない場合、それは計算し、持続し、提供されたデータセット計画戻っ:Spark Dataset [T]コンストラクタとしての一般的なT
import scala.util.{Try, Success, Failure}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.Dataset
sealed trait CustomRow
case class MyRow(
id: Int,
name: String
) extends CustomRow
val ds: Dataset[MyRow] =
Seq((1, "foo"),
(2, "bar"),
(3, "baz")).toDF("id", "name").as[MyRow]
def tryParquet[T <: CustomRow](session: SparkSession, path: String, target: Dataset[T]): Dataset[T] =
Try(session.read.parquet(path)) match {
case Success(df) => df.as[T] // <---- compile error here
case Failure(_) => {
target.write.parquet(path)
target
}
}
val readyDS: Dataset[MyRow] =
tryParquet(spark, "/path/to/file.parq", ds)
しかしこれはdf.as[T]
にコンパイルエラーを生成した:
データセットに格納されているタイプのエンコーダを見つけることができません。
他の型をシリアル化するためのサポートは、将来のリリースで追加される予定です。
場合成功(DF)=> df.as [T]
一つは、型なしDataFrame
を返し、所望のコンストラクタに発信者キャストせるtryParquet
キャストdf
することによってこの問題を回避することができます。しかし、型が内部的に関数によって管理されるようにするための解決策はありますか?