我是Scala的初学者,我遇到一种情况,我试图获取数据帧中的特定列并将其传递给另一种方法进行进一步处理。
在这种情况下,我能够以String形式获取列值。我可以做两个:
将字符串转换为Map [String,Map [String,Int]]
将IndexedSequence [Map [String,Map [String,Int]]]]转换为Map [String,Map [String,Int]]
我的数据框中的值如下:
[endGoal -> [a -> 10, b -> 10], max -> [a -> 30, b -> 30]]
试图将字符串转换为Map [String,Map [String,Int]]的代码段如下:
val map = recordArray(33) //Got the String
//Converting it to IndexedSequence[Map[String, Map[String, Int]]]
val result = for (line <- map; array = map.split(",").map(_.trim))
yield Map(array.head -> array.tail.map(x => {val y = x.split(":"); (y(0).toString, y(1).toInt)}).toMap)
但是上面的代码帮助我将其仅转换为IndexedSequence [Map [String,Map [String,Int]]]
我一直无法将其转换为Map [String,Map [String,Int]]。您能以一个示例说明如何在所需类型中实现值吗?
谢谢。
答案 0 :(得分:0)
基本上,我采用错误的方法来解决问题。.我的坏处..我正在尝试执行以下操作:
data.foreachPartition { rddpartition =>
rddpartition.foreach { record =>
var recordString = record.mkString(“,”)
var recordArray = recordString.split(“,”)
我最终在哪里得到一个字符串,然后被困在试图将字符串转换为Map [String,Map [String,Int]]并最终得到IndexedSequence [Map [String,Map [String,Int]] ]]。
找到2个解决方案:
根据我上面的尝试,添加:
result.toList.flatten.toMap
将IndexedSequence [Map [String,Map [String,Int]]]转换为Map [String,Map [String,Int]]
我应该通过执行以下操作直接从数据框中获取Map [String,Map [String,Int]]:
data.foreachPartition { rddpartition =>
rddpartition.foreach { record =>
val uid = record.getAs[String]("uid")
val advertiserId = record.getAs[String]("advertiserId")
val time = record.getAs[Long]("time")
val map = record.getAs[Map[String, Map[String, Int]]]("map")
val crossDeviceUsers = record.getAs[mutable.WrappedArray[String]]("crossDeviceUsers")