Elbette bir Satır nesnesini bir kasa sınıfıyla eşleştirebilirsiniz. SchemaType ürününüzün birçok alanı olduğunu varsayalım ve bunlardan birkaçını davanızın sınıfına uydurmak istiyorsunuz.
case class MyClass(a: Long, b: String, c: Int, d: String, e: String)
dataframe.map {
case Row(a: java.math.BigDecimal,
b: String,
c: Int,
_: String,
_: java.sql.Date,
e: java.sql.Date,
_: java.sql.Timestamp,
_: java.sql.Timestamp,
_: java.math.BigDecimal,
_: String) => MyClass(a = a.longValue(), b = b, c = c, d = d.toString, e = e.toString)
}
Bu yaklaşım boş değerler söz konusu olduğunda başarısız olur ve aynı zamanda açıkça her bir alanın türünü tanımlarım gerektirir: Eğer boş alanları yok ise sadece yapabilirsiniz. null alanlar vaka sınıf için eşleşen Deseninizdeki kullanılan olanlar olmasalar bile sen
dataframe.na.drop()
kayıtları düşecek
yaparak boş değerler içeren tüm satırları atmak yapmalı ya boş değerler ele varsa . Yoksa idare isterseniz bir Listesine Sıra nesnesi açmak ve daha sonra seçenek deseni kullanabilirsiniz:
case class MyClass(a: Long, b: String, c: Option[Int], d: String, e: String)
dataframe.map(_.toSeq.toList match {
case List(a: java.math.BigDecimal,
b: String,
c: Int,
_: String,
_: java.sql.Date,
e: java.sql.Date,
_: java.sql.Timestamp,
_: java.sql.Timestamp,
_: java.math.BigDecimal,
_: String) => MyClass(a = a.longValue(), b = b, c = Option(c), d = d.toString, e = e.toString)
}
Kontrol Bu github proje Sparkz() yakında bir sürü tanıtacak Spark ve DataFrame API'lerini basitleştirmek ve daha işlevsel programlama odaklı hale getirmek için kütüphaneler.
Muhtemelen şekilsiz için databricks tarafından sağlanan bağlantıyı (https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless- altına
bakınız 2.0.0 # genel-temsil-mühürlü-aileler-vaka-sınıfları) boilerplate azaltmaya yardımcı olabilir, ama muhtemelen çok fazla null's sevmez. Belki makrolar (birçok vaka sınıfınız varsa)? –
Asla makroları denemediniz. Burada bir problem, dillere yönelik standartlara inananlarım. Her zaman kendi yöntemlerimi yapabileceğimi ya da başka birini kullanabileceğimi hayal edebiliyorum ... ama nasıl bir dışsallık olmadan yapıldığını anlamaya çalışıyorum. – arivero
merak ediyorum ... belki de "myCaseClass" ı Satır'dan almalı mıyım? – arivero