在Scala中将DataFrame转换为RDD [Map]

时间:2016-04-14 09:07:44

标签: scala apache-spark

我想转换创建的数组,如:

case class Student(name: String, age: Int)
val dataFrame: DataFrame = sql.createDataFrame(sql.sparkContext.parallelize(List(Student("Torcuato", 27), Student("Rosalinda", 34))))

当我从DataFrame收集结果时,生成的数组是Array[org.apache.spark.sql.Row] = Array([Torcuato,27], [Rosalinda,34])

我正在考虑在RDD [Map]中转换DataFrame,例如:

Map("name" -> nameOFFirst, "age" -> ageOfFirst)
Map("name" -> nameOFsecond, "age" -> ageOfsecond)

我尝试使用地图:x._1但这似乎不适用于Array [spark.sql.row]我怎样才能执行转换?

2 个答案:

答案 0 :(得分:6)

您可以使用带有模式匹配的地图功能来完成此处的工作

import org.apache.spark.sql.Row

dataFrame
  .map { case Row(name, age) => Map("name" -> name, "age" -> age) }

这将导致RDD[Map[String, Any]]

答案 1 :(得分:0)

换句话说,您可以将数据框的行转换为地图,并且可以正常工作!

def dfToMapOfRdd(df: DataFrame): RDD[Map[String, Any]] = {
    val result: RDD[Map[String, Any]] = df.rdd.map(row => {
        row.getValuesMap[Any](row.schema.fieldNames)
    })
    result
}

引用:https://stackoverflow.com/a/46156025/6494418