首页 > 解决方案 > 如何从数据框转换为 RDD 并使用案例类返回

问题描述

我试图弄清楚如何将数据帧转换为 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

也许我正在以王的方式来解决这个问题,或者有一些自定义的方式来进行铸造?

标签: apache-spark

解决方案


推荐阅读