繁体   English   中英

将 Spark 的 DataFrame 转换为 RDD[Vector]

[英]Convert Spark's DataFrame to RDD[Vector]

当我尝试使用以下代码将 Spark 的DataFrame转换为RDD[org.apache.spark.mllib.linalg.Vector]

import org.apache.spark.sql.Row
import org.apache.spark.mllib.linalg.Vectors

val df = sqlContext.createDataFrame(
  Seq((0.1, 0.2, 0.4))
).toDF("t1", "t2", "t3")

df.rdd.map{ case Row(row: Seq[_]) =>
  Vectors.dense(row.asInstanceOf[Seq[Double]].toArray)
}.collect

我收到了这样的错误消息:

scala.MatchError: [0.1,0.2,0.4] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema)

然后我尝试了另一种方法:

df.content.rdd.map{ case row =>
  Vectors.dense(row.toSeq.toArray.map{
    x => x.asInstanceOf[Double]
  })
}.collect

效果很好。

虽然在Spark-2.2.0-SNAPSHOT 正式版中引入了第一种方法,当将row转换为Array[Double] ,它不起作用。

任何人都可以找出原因吗?

这两种方法不做同样的事情。 在第一种情况下,您尝试匹配具有单个ArrayType列的Row 由于您的输入包含三列,因此MatchException是预期的结果。 例如,这仅在您将列收集为数组时才有效

df.select(array(df.columns.map(col(_)): _*)).rdd.map { 
  case Row(xs: Seq[Double @unchecked]) => xs 
}

或者

df.select(array(df.columns.map(col(_)): _*)).rdd.map(_.getSeq[Double](0))

在第二种情况下,您将行转换为Seq[Any] ,它为您提供一系列字段值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM