私は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のカスタムクラスを使用すると、フィールド名に直接アクセスする方法チェマ?
ケースクラスを使用しない理由は何ですか?いずれにしても、ケースクラスが何をしているのかをレプリケートして、コンストラクターに必要な名前で使用可能なvalを割り当てることができます。 –