Spark数据帧到嵌套映射

时间:2016-12-20 08:50:05

标签: scala apache-spark dataframe hashmap apache-spark-sql

如何将spark中的相当小的数据帧(最大300 MB)转换为嵌套映射,以便改进spar的DAG。我相信这个操作比后来加入(Spark dynamic DAG is a lot slower and different from hard coded DAG)更快,因为转换值是在自定义估算器的训练步骤中创建的。现在我只想在管道的预测步骤中快速应用它们。

val inputToMap = inputSmall.collect.map(r => Map(inputSmall.columns.zip(r.toSeq):_*))

这会提供错误的地图类型

Map[String, Map[String, Double]]("column1" -> Map("A" -> 0.3, "d" -> 0.0, ...), "column2" -> Map("B" -> 0.25), "g" -> 0.4, ...)

我宁愿想要这样的东西:

Incoming Image

2 个答案:

答案 0 :(得分:3)

修改:从最终地图中删除了收集操作

如果你使用Spark 2+,这里有一个建议:

val inputToMap = inputSmall.select(
  map($"column1", $"transformedCol1").as("column1"),
  map($"column2", $"transformedCol2").as("column2")
)

val cols = inputToMap.columns
val localData = inputToMap.collect

cols.map { colName => 
  colName -> localData.flatMap(_.getAs[Map[String, Double]](colName)).toMap
}.toMap

答案 1 :(得分:0)

我不确定我是否遵循了这一动机,但我认为这是一种可以让您获得结果的转变:

QTextStream