在Scala中将IndexedSequence[Map[String,Map[String,Int]]]转换为Map[String,Map[String,Int]]
我是Scala的初学者,有一个例子,我试图获取数据帧中的一个特定列,并将其传递给另一个方法进行进一步处理 在本例中,我能够以字符串的形式获取列值。我可以执行以下两种操作之一:在Scala中将IndexedSequence[Map[String,Map[String,Int]]]转换为Map[String,Map[String,Int]],string,scala,dataframe,type-conversion,String,Scala,Dataframe,Type Conversion,我是Scala的初学者,有一个例子,我试图获取数据帧中的一个特定列,并将其传递给另一个方法进行进一步处理 在本例中,我能够以字符串的形式获取列值。我可以执行以下两种操作之一: 将字符串转换为Map[String,Map[String,Int]] 将IndexedSequence[Map[String,Map[String,Int]]]转换为Map[String,Map[String,Int]] 我的数据框中的值如下所示: [endGoal -> [a -> 10, b -> 1
[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)
val-map=recordArray(33)//获取字符串
//将其转换为IndexedSequence[Map[String,Map[String,Int]]
val result=for(linearray.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]]。你能用一个例子来解释一下如何达到所需类型的价值吗
谢谢。基本上,我解决问题的方法是错误的。。我的错。。我试着这样做:
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]]
找到了两种解决方案:
result.toList.flatten.toMap
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")
我不确定我是否理解:您的数据帧值是您自己要解析的字符串?
[endGoal->[a->10,b->10],max->[a->30,b->30]
是字符串吗?recordArray(33)返回什么?它是单个字符串吗?如果是这样的话,就不要用来理解它。这就是您的索引eq
的来源。如果它不仅仅是一个字符串
,那么为什么你要从中提取行
,而从不使用它呢?@francoisr我做了这样一个foreach分区:data.foreachPartition{rddpartition=>rddpartition.foreach{record=>var recordString=record.mkString(“,”)var recordArray=recordString.split(,”)最后得到了一个字符串,我后来正努力将它转换为IndexedSequence[Map[string,Map[string,Int]].@jwvh我知道我处理这个问题的方法是错误的。我试图这样做:data.foreachPartition{rddpartition=>rddpartition.foreach{record=>var recordString=record.mkString(“,”)var recordArray=recordString.split(“,”),其中我将每个记录转换为一个不需要的字符串。我能够使用:val map=record.getAs[map[string,map[string,Int]](“map”)这使我能够根据需要获取数据。然后,您可以在下面的表格中自己回答您的问题,这样其他人就可以看到它,而无需深入查看评论。