我想转换创建的数组,如:
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]
我怎样才能执行转换?
答案 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
}