我有一个数据集,我正在将值收集到一个数组中。
样本数据:
val sampleData= Seq(
("1", "12"),
("2","22")
).toDF("id","value").as[(String,String)]
我必须迭代此数据集并使用数据集中存在的值形成结果列表(地图)。
输出应如下所示
List(
Map("id"-> "1", "value"->"12"),
Map("id"-> "2", "value"->"22"))
我尝试在外部创建一个变量
finalData
,并尝试在遍历数组时保存该值,但该变量在foreach
条件内没有任何范围。
我尝试过的片段
val finalData = List[Map[String,String]]
val someData = ReconResultDSDummy.collect().foreach(f => {
var intermediateData = Map("id" -> f._1, "value" -> f._2)
var finalData = finalData :+ intermediateData
}
我无法在迭代数据时递归地将值添加到
finalData
。
请让我知道我在这里缺少什么或者是否有更好的方法。
“基本”实现是将
map
每个元组转换为 Map
而不是 foreach
,这是为了产生副作用但忽略结果:
val someData = df
.collect()
.map(f => Map("id" -> f._1, "value" -> f._2))
// Gives a Seq[Map[String, String]]
这里需要注意的一个潜在重要事项是,调用
collect()
会将驱动程序节点上的所有数据加载到内存中。如果它不适合内存,它将失败。
一般来说,您需要在
map()
之前执行 collect()
以减少驱动程序上的负载。 在这种具体情况下,我不确定这会产生任何真正的影响。