2016-04-06 31 views
2

Dataset API ile kullanılan bir vaka sınıfında Option[_] üyesini kullanmak mümkün mü? Örneğin. Option[Int]Seçenek türü kurucu için kodlayıcı nasıl oluşturulur, ör. Seçenek [Uluslararası]?

Bir örnek bulmaya çalıştım ama henüz bulamadım. Bu muhtemelen bir özel kodlayıcı ile yapılabilir (haritalama?) Ancak bunun için bir örnek bulamadım.

Bu, Çerçevesiz kitaplık kullanılarak elde edilebilir: https://github.com/adelbertc/frameless, ancak temel Spark kitaplıklarıyla yapmanın kolay bir yolu olmalıdır.

türü için kodlayıcı bulunamadı bir saklanan: Birini [Uluslararası] kullanmaya çalışırken "org.apache.spark" %% "spark-core" % "1.6.1"

Ve aşağıdaki hatayı alıyorum:

Güncelleme

kullanıyorum Veri kümesi. İlkel türleri (Int, String, vb) ve ürün türleri (vaka sınıfları) gelecek sürümleri

Çözüm güncelleme

eklenecektir diğer türleri seri hale sqlContext.implicits._ Destek ithal tarafından desteklenmektedir

Prototipleme yaptığımdan beri, Dataset'e dönüştürmeden önce işlev içinde vaka sınıfını bildiriyordum (benim durumumda object Main {).

Seçenek türleri, ana sınıfı dışındaki durum sınıfını taşıdığımda iyi çalıştı. "Gelecek sürümlerde diğer türlere serileştirme desteği eklenecek" #

cevap

8

Yalnızca in SQLImplicits desteklediğimiz türlerin bir alt kümesi için örtük tanımlar. İç altyapı Option'u anlayacağından, Option[T]'u ortak T için eklemeyi düşünmeliyiz. Bu sorunu, Tuple veya constructing the required implicit yourself kullanarak bir case class oluşturarak yapabilirsiniz (bununla birlikte, bu, kullanılmakta olan iç API'dir ve gelecekteki sürümlerde kırılabilir).

implicit def optionalInt: org.apache.spark.sql.Encoder[Option[Int]] = org.apache.spark.sql.catalyst.encoders.ExpressionEncoder() 

val ds = Seq(Some(1), None).toDS() 
+0

Yaptığım hatayı buldum, sanki scala, bir fonksiyonun içinde ve dışında bir dava sınıfını bildiriyor gibi görünüyor. Vaka sınıfının Main dışında bildirilmesi, '_ [_]' fonksiyonunun herhangi bir ek örtülü olmaksızın doğru şekilde çalışmasına izin verdi. Bahsettiğiniz örtüyü kullanmayı denedim, ancak çalışmayı başaramadım (vaka sınıfı bir işlev içinde tanımlandığında, örneğin Ana). Veri kaynağım bir MS SQL Server DB'dir. –

+0

Nedeniyle Timestamp tür kodlama çalışır ancak GregorianCalendar yok, her ikisi de AlexeyRomanov'un yorumunda belirtilen dosyada listelenmiyor –

2

Özel kodlayıcılar henüz planlanmış olsa da desteklenmiyor. Özelliği kendiniz uygulamaya çalışabilirsiniz, ancak kesinlikle resmi bir örnek yoktur.

Bir seçenek, Seq[Int] üye kullanmak ve yalnızca en fazla bir değere sahip olduğundan emin olmaktır.

+2

Yukarıdaki bu cevabı ve benim yorum almak ve bunları birleştirmek olabilir - denilen bir olgu sınıf 'a Seq [Uluslararası]' sarılı OptionalInt'. Daha sonra, 'isDefined' ve 'isEmpty 've' get 've hatta case sınıfında' getOrElse' komutunu uygulayabilirsiniz. –

+1

@DavidGriffin: Bunun için bir cevap ekleyebilir misiniz lütfen? Scala'm biraz paslı. Bu arada bunu uygulamaya çalışacağım. –

+0

@Alexey Romanov: Görünüşe göre, “Seq [Int]', bir de desteklenmeyen tip olarak ele alındığı için işe yaramıyor. –