2017-05-14 44 views
0

我使用Spark 1.3。In Spark如何通過名稱本身而不是其索引來讀取字段

我的數據有50個以上的屬性,因此我去了一個自定義類。

如何通過它的名稱每次我需要調用一個方法時,訪問一個字段從一個自定義類不受其位置

這裏productElement(0)

而且我不應該使用情況類,因此我正在使用模式的自定義類。

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)) 

如果我嘗試訪問從OnlineEvents然後我需要使用productElement()的任何字段(即online.productElement(0),gsm_id)

我可以直接訪問字段online.gsm_id ... online.event_type,以便我的代碼易於閱讀

我如何直接訪問字段的名稱時,我使用自定義類的s CHEMA?

+0

不使用大小寫類的原因是什麼?在任何情況下,您都可以複製case類所做的事情,只需在構造函數中指定val,然後在您想要的名稱下使用。 –

回答

0

我強烈建議使用每個用例的情況下類(其中一起涉及使用該數據的所有用例)。

然後一個用例就是一個單獨的用例類,它可以爲您節省很多關於如何維護50多個字段的想法。

是的,你會爲10個5字段的案例類「交易」一個大的50個或更多字段的類,但是給出了創建案例類的容易程度,以及它們如何很好地描述你的數據我認爲這是值得的麻煩。

1

根據我對你的問題的理解,你需要在OnlineEvents裏面定義一些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] 

} 

,並調用funtions如下

val keyvalueRDD = schemaRDD .map(online => ((online.get_gsm_id().toString,online.get_event_type().toString),online)) 
相關問題