Apache spark 在Spark中,如何通过字段名称本身而不是索引来读取字段
我使用Spark 1.3 我的数据有50多个属性,因此我选择了一个自定义类 如何通过名称而不是位置从自定义类访问字段 这里每次我需要调用一个方法productElement0时 此外,我不应该使用case类,因此我将使用一个自定义类作为模式Apache spark 在Spark中,如何通过字段名称本身而不是索引来读取字段,apache-spark,apache-spark-1.3,Apache Spark,Apache Spark 1.3,我使用Spark 1.3 我的数据有50多个属性,因此我选择了一个自定义类 如何通过名称而不是位置从自定义类访问字段 这里每次我需要调用一个方法productElement0时 此外,我不应该使用case类,因此我将使用一个自定义类作为模式 class OnlineEvents(gsm_id:String, attribution_id:String, event_date:String, event_timestamp:String
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.e.online.productElement0作为gsm\U id
我是否可以作为online.gsm\u id直接访问该字段。。。online.event_类型,以便我的代码易于阅读
当我为模式使用自定义类时,如何通过字段名直接访问字段?根据我对您问题的理解,您需要在OnlineEvents中定义一些函数来返回类型。所以你的解决方案应该是
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))
我强烈建议对每个用例使用一个case类,它涵盖了使用数据的所有用例 一个单一的用例就是一个单一的用例类,它将为您节省大量关于如何维护50多个字段的思考
是的,你可以用一个50个或更多字段的大类来交换10个5个字段的案例类,但是考虑到创建一个案例类是多么容易,而且它们能够很好地描述你的数据,我认为这是值得的。不使用案例类的原因是什么?在任何情况下,您都可以复制case类的功能,只需在构造函数中分配VAL,这些VAL在您所需的名称下可用。