2016-12-08 52 views
5

Jeśli chcę zapisać Algebraiczny Typ Danych (ADT) (tj. Scala zaplombowana hierarchia cech) w kolumnie Spark DataSet, jaka jest najlepsza strategia kodowania?Zakoduj hierarchię ATT/zapieczętowanej cechy w kolumnie Zestawu danych Spark

Na przykład, jeśli mam ADT gdzie rodzaje liści przechowywać różne rodzaje danych:

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

Co najlepszym sposobem skonstruować:

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

Odpowiedz

4

TL; DR Istnieje obecnie nie jest dobrym rozwiązaniem i biorąc pod uwagę wdrożenie Sparka SQL/Dataset, jest mało prawdopodobne, aby wystąpił w przewidywalnej przyszłości.

Można użyć generycznych kryo lub java Encoder

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

ale jest mało przydatna w praktyce.

UDT API zapewnia inne możliwe podejście jak na razie (Spark 1.6, 2.0, 2.1-SNAPSHOT) jest prywatna i wymaga dość dużo kodu szablonowe (można sprawdzić o.a.s.ml.linalg.VectorUDT zobaczyć przykładową implementację).