在spark中,有没有办法将RDD对象转换为case对象

时间:2017-05-21 07:26:26

标签: scala apache-spark

我是Spark计划的新手,我遇到了case class的新手,我需要在我的case class中使用RDD:< / p>

例如,我有一个RDD tuples喜欢:

Array[(String,String,String)] 

具有以下值:

Array((20254552,ATM,-5100), (20174649,ATM,5120)........)

是否有任何方法可将上述RDD转换为:

20254552,trans(ATM,-5100)

其中transcase class

2 个答案:

答案 0 :(得分:2)

是。绝对可以做到这一点。以下代码可以帮助您做到这一点

val array = Array((20254552,"ATM",-5100), (20174649,"ATM",5120))
val rdd = sparkContext.parallelize(array)
val transedRdd = rdd.map(x => (x._1, trans(x._2, x._3)))

您应该在当前课程之外创建case class

case class trans(atm : String, num: Int)

我希望它有所帮助

答案 1 :(得分:2)

这不是您问题的真正答案,但我建议您尽可能使用DataframeDataset。使用它们将使您受益匪浅,例如提高编码效率,经过良好测试的帧字,优化使用更少的内存并完全受益于火花引擎。

有关RDDDataframeDataset s

的差异和用例的详细信息,请参阅check out the documentation for the directive here

使用Dataset s解决问题的方法非常简单:

import spark.implicits._
val ds = Seq((20254552,"ATM",-5100), (20174649,"ATM",5120)).toDS()
val transsedds = ds.map(x => (x._1, trans(x._2, x._3)))

正如@Ramesh所说,您应该在当前类之外创建案例类

case class trans(atm : String, num: Int)

希望它有所帮助。