【问题标题】:Convert DataFrame to RDD[Map] in Scala在 Scala 中将 DataFrame 转换为 RDD[Map]
【发布时间】:2020-10-24 09:10:02
【问题描述】:

我想转换一个像这样创建的数组:

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] 我如何才能执行转换?

【问题讨论】:

  • 外层map没有键值结构?
  • 上下文是我想使用 spark-jobserver 但在作业结果的序列化方面存在一些问题。显然只有字符串键/值的映射有效。返回的结果将是几个 spark 查询的聚合。所以外部地图会包含更多的键。 groups.google.com/forum/#!topic/spark-jobserver/V4finry_RoM
  • 这是一个非常糟糕的问题,具有误导性的标题、不好的做法、低质量的描述。当您在此处发布问题时,您需要处理这些内容

标签: scala apache-spark


【解决方案1】:

您可以在这里使用带有模式匹配的 map 函数来完成这项工作

import org.apache.spark.sql.Row

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

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

【讨论】:

  • 不适合我我得到 scala.Any 错误 --> 线程“main”中的异常 java.lang.ClassNotFoundException: scala.Any
【解决方案2】:

换句话说,您可以将数据框的行转换为地图,下面的作品!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2018-03-05
    • 1970-01-01
    • 2017-06-13
    • 2018-11-08
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多