13

代数データ型 (ADT) (つまり、Scala の封印された特性階層) を Spark DataSet列に格納したい場合、最適なエンコード戦略は何ですか?

たとえば、リーフ型がさまざまな種類のデータを格納する ADT があるとします。

sealed trait Occupation
case object SoftwareEngineer extends Occupation
case class Wizard(level: Int) extends Occupation
case class Other(description: String) extends Occupation

構築する最良の方法は次のとおりです。

org.apache.spark.sql.DataSet[Occupation]
4

2 に答える 2

10

TL;DR現在、適切な解決策はありません。Spark SQL/Dataset実装を考えると、近い将来に解決策が存在する可能性は低いです。

ジェネリックkryoまたはjavaエンコーダーを使用できます

val occupation: Seq[Occupation] = Seq(SoftwareEngineer, Wizard(1), Other("foo"))
spark.createDataset(occupation)(org.apache.spark.sql.Encoders.kryo[Occupation])

しかし、実際にはほとんど役に立ちません。

1.6UDT API は、現時点では (Spark 、2.0、 )別の可能なアプローチを提供します。2.1-SNAPSHOTこれは非公開であり、かなり多くのボイラープレート コードが必要です (o.a.s.ml.linalg.VectorUDT実装例を確認できます)。

于 2016-12-11T02:57:41.687 に答える