我试图弄清楚如何将数据帧转换为RDD(以便进行配对操作)并再次返回。当前,当我这样做时,我收到“无法将GenericRowWithSchema强制转换为SaltedUser”的异常
我从案例课开始
case class SaltedUser(salt: Long, userId: Long)
接下来,我创建一个数据框
scala> Seq((1, SaltedUser(1, 1)), (2, SaltedUser(2, 2)), (3, SaltedUser(3, 3))).toDF("key", "SaltedUser").show
+---+----------+
|key|SaltedUser|
+---+----------+
| 1| [1, 1]|
| 2| [2, 2]|
| 3| [3, 3]|
+---+----------+
现在,如果我要将其转换为RDD(例如,因为我想执行reduceByKey)并将其转换回
scala> Seq((1, SaltedUser(1, 1)), (2, SaltedUser(2, 2)), (3, SaltedUser(3, 3))).toDF("key", "SaltedUser").rdd.map(r => (r.getInt(0), r.getAs[SaltedUser](1))).toDF.show
这将引发以下异常:
Caused by: java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to SaltedUser
也许我会用这种方式,否则是否有一些自定义方式来进行投射?