2017-05-14 2 views
0

私はSpark 1.3を使用します。Sparkでは、インデックスの代わりに名前自体でフィールドを読み取るには

私のデータは50以上の属性を持っているため、私はカスタムクラスに行きました。私はここでその位置

ではない、その名前でカスタムクラスから、私はメソッドを呼び出す必要があるたびに、フィールドにアクセスするにはどうすればよい

は(0)

また

私はケースを使用することになっておりませんproductElementしたがって、私はスキーマのカスタムクラスを使用しています。

class OnlineEvents(gsm_id:String, 
      attribution_id:String, 
      event_date:String, 
      event_timestamp:String, 
      event_type:String 
     ) extends Product { 

    override def productElement(n: Int): Any = n match { 
    case 0 => impression_id 
    case 1 => attribution_id 
    case 2 => event_date 
    case 3 => event_timestamp 
    case 4 => event_type 

    case _ => throw new IndexOutOfBoundsException(n.toString) 
} 

    override def productArity: Int = 5 

    override def canEqual(that: Any): Boolean = that.isInstanceOf[OnlineEvents] 

} 

マイスパークコード:

val onlineRDD = sc.textFile("/user/cloudera/input_files/online_events.txt") 

    val schemaRDD = onlineRDD.map(record => { 
             val arr: Array[String] = record.split(",") 
              new OnlineEvents(arr(0),arr(1),arr(2),arr(3),arr(4)) 
}) 
val keyvalueRDD = schemaRDD .map(online => ((online.productElement(0).toString,online.productElement(4).toString),online)) 

私はproductElementを()を使用する必要があり、その後OnlineEventsから任意のフィールドにアクセスしようとする場合(つまりonline.productElement(0)gsm_id用)

私はコードを簡単に読むことができるように、online.gsm_id ... online.event_typeとして直接フィールドにアクセスできますか?

sのカスタムクラスを使用すると、フィールド名に直接アクセスする方法チェマ?

+0

ケースクラスを使用しない理由は何ですか?いずれにしても、ケースクラスが何をしているのかをレプリケートして、コンストラクターに必要な名前で使用可能なvalを割り当てることができます。 –

答えて

0

以下のようにfuntionsを呼び出す必要があります。

1つのユースケースは、50以上のフィールドを維持する方法について多くの考えを保存する単一のケースクラスになります。

10個の5フィールドのケースクラスに対して、50個以上のフィールドクラスを1つだけ「トレード」することはできますが、ケースクラスを作成するのが簡単で、私はそれが面倒の価値があると思う。

1

私のご質問によると、タイプの中にfunctionsを定義して型を返す必要があります。だからあなたのソリューションは、

class OnlineEvents(gsm_id:String, 
        attribution_id:String, 
        event_date:String, 
        event_timestamp:String, 
        event_type:String 
       ) extends Product { 
    def get_gsm_id(): String ={ 
    gsm_id 
    } 

    def get_attribution_id(): String ={ 
    attribution_id 
    } 

    def get_event_date(): String ={ 
    event_date 
    } 

    def get_event_timestamp(): String ={ 
    event_timestamp 
    } 

    def get_event_type(): String ={ 
    event_type 
    } 

    override def productElement(n: Int): Any = n match { 
    case 0 => gsm_id 
    case 1 => attribution_id 
    case 2 => event_date 
    case 3 => event_timestamp 
    case 4 => event_type 

    case _ => throw new IndexOutOfBoundsException(n.toString) 
    } 

    override def productArity: Int = 5 

    override def canEqual(that: Any): Boolean = that.isInstanceOf[OnlineEvents] 

} 

なると私は強く(すべて一緒にデータを使用するすべてのユースケースをカバーする)ユースケースごとにケースクラスを使用することをお勧めし

val keyvalueRDD = schemaRDD .map(online => ((online.get_gsm_id().toString,online.get_event_type().toString),online)) 
関連する問題