2016-09-27 7 views
0

classeseケースをマッピングするためのScalaの最良の方法私は火花やスカラ座での作業とこのようになりますデータセットを定義する場合クラス持っている:スパークと

case class Shareholders(
    business_id : String, 
    guo_name : String, 
    guo_id : String, 
    duo_name : String, 
    duo_id : String 
) 

を「郭」で始まる、より多くのフィールドがあります。 /"デュオ"。この接頭辞とは別に、フィールド名は同じ/繰り返されます。

Iは、のように見える場合クラス構造体を形成したい:

タイプ=「郭」/「デュオ」等のような適切な
case class NewShareholders(
    business_id : String, 
    repeatedFields : Seq[RepeatedShareholderFields] 
) 

case class RepeatedShareholderFields ( 
    name : String, 
    id : String 
    type : String 
) 

を。

これはどのように行うのが最適でしょうか?

+0

Spark 'Dataset'sをSQLリレーショナルテーブルであるかのように設計することを強くお勧めします。 Sparkが最適化されました。これまでのあなたの例から、私はあなたに良い解決策を思いつくことはできません。私が本当に言うことができる唯一のことは、あなたの「株主」テーブルを正常化する方法についてDBAに相談することです。 – Yawar

答えて

0
import scala.language.existentials 

case class NewShareholder(
    businessId : String, 
    fields : Seq[ShareholderField[T forSome {type T}]] 
) 

case class ShareholderField[T] ( 
    prefix : String, 
    nameValue: T 
    idValue: T,  
) 

// Now you can create you share holders as follows, 

val sh1 = NewShareHolder(
    businessId = "abcde-1234" 
    fields = Seq(
    ShareholderField[String]("guo", "guo-name-1", "guo-id-1") 
    ShareholderField[String]("duo", "duo-name-1", "duo-id-1") 
    ShareholderField[UUID]("luo", UUID.randomUUID(), UUID.randomUUID()) 
) 
) 

実際にすべての値がStringであることがわかっている場合は、簡略化することができます。

case class NewShareholder(
    businessId : String, 
    fields : Seq[ShareholderField] 
) 

case class ShareholderField ( 
    prefix : String, 
    nameValue: String, 
    idValue: String,  
) 

// Now you can create you share holders as follows, 

val sh1 = NewShareHolder(
    businessId = "abcde-1234" 
    fields = Seq(
    ShareholderField("guo", "guo-name-1", "guo-id-1") 
    ShareholderField("duo", "duo-name-1", "duo-id-1") 
    ShareholderField("luo", "luo-name-1", "luo-id-1") 
) 
)