【问题标题】:Convert Spark DataFrame to spark.rdd.RDD[(Array[Integer], Array[Integer]) to calculate mean average precision将 Spark DataFrame 转换为 spark.rdd.RDD[(Array[Integer], Array[Integer]) 以计算平均精度
【发布时间】:2021-09-02 11:24:57
【问题描述】:

我有一个 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 转换为该格式,以便计算平均精度?谢谢。

【问题讨论】:

  • 您的数据框架构是什么?你能提出示例数据来测试你的过程吗?无法复制图像并重新创建问题。
  • @Lamanus 两列都是数组(或列表)您可以使用以下方法创建示例: val df = Seq( (List(1, 9,16), List(27, 729, 688 )), (List(1, 4, 548), List()), (List(1,5,3), List(688)) ).toDF("predicted", "actual")

标签: dataframe apache-spark multidimensional-array rdd average-precision


【解决方案1】:

因为错误只是告诉您 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 2012-01-03
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2021-01-13
      • 2013-05-20
      相关资源
      最近更新 更多