2016-12-08 30 views
5

Bir Spark DataSet sütununda bir Cebirsel Veri Türü (ADT) (örneğin Scala sızdırmaz özellik hiyerarşisi) depolamak istiyorsam, en iyi kodlama stratejisi nedir? en iyi yolu inşa etmek nedirBir ADT/kapalı özellik hiyerarşisini Spark DataSet sütunu içine kodlayın

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

: Bir ADT varsa

Örneğin, yaprak tipleri farklı türde veriler depolamak nerede

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

cevap

4

TL; Orada DR Şu anda iyi bir çözüm değil ve Spark SQL/Dataset uygulaması verildiğinde, öngörülebilir gelecekte de bir ihtimal olmayacaktır.

Sen jenerik kryo veya java encoder

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

kullanmak ama pratikte pek yararlıdır olabilir.

UDT API'si özel bir yer olduğundan ve (eğer örnek uygulamasını görmek için o.a.s.ml.linalg.VectorUDT kontrol edebilirsiniz) oldukça çok Demirbaş kodu gerektirir şimdilik başka olası bir yaklaşım (Spark 1.6, 2.0, 2.1-SNAPSHOT) sağlar.