0

我有一个 Spark DataFrame:

数据框

我必须使用 Spark 和 Scala 来计算RankingMetrics的平均精度。我猜根据文档我们必须使用 RDD 而不是 DataFrame。我尝试了以下方法:

var llist = df.select("predicted", "actual").rdd.map(x => (x.get(0), x.get(1))).collect()
// It gave Array[(Any, Any)]

var df_rdd =sc.parallelize(llist)
// df_rdd is org.apache.spark.rdd.RDD[(Any, Any)]

val metrics = new RankingMetrics(df_rdd)
// This gave me an error

错误

错误:类型不匹配;
找到:org.apache.spark.rdd.RDD[(Any, Any)]
需要:org.apache.spark.rdd.RDD[(Array[?], Array[?])]
注意:(Any, Any) > : (Array[?], Array[?]),但是类 RDD 在类型 T 中是不变的。
您可能希望将 T 定义为 -T。(SLS 4.5)

我正在使用 Spark 2.4.3 版

如何将此 DataFrame 转换为该格式,以便计算平均精度?谢谢。

4

2 回答 2

0

由于错误只是告诉您 RankingMetrics 的参数应该是类型

(数组[?], 数组[?])

但是,当您检查您的 RDD 时,您只需键入df.rdd 即可,它会显示:

org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]

所以基本上你必须将这种 Row 类型的数据转换为 Array 类型。一种方法是像这样映射它:

df.rdd.map(r=>(Array(r(0)),Array(r(1))))

这不是建议的方式。同样在您的用例中,不要从创建数据框开始,而是使用所需类型的数据(在您的情况下为(Array [],Array []))创建一个 RDD。此外,要从数据框创建 RDD,您应该使用:

df.rdd
于 2021-06-29T18:48:04.157 回答
0

ADataFrame本质上是一个RDD在幕后,你DataFrame有 type DataFrame[Array[Int], Array[Int]]。因此,根据您报告的类型,您应该可以将其直接传递给new RankingMetrics(df.rdd()). 未测试。

于 2021-06-29T17:30:30.900 回答