在Scala中将IndexedSequence[Map[String,Map[String,Int]]]转换为Map[String,Map[String,Int]]

在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

我是Scala的初学者,有一个例子,我试图获取数据帧中的一个特定列,并将其传递给另一个方法进行进一步处理

在本例中,我能够以字符串的形式获取列值。我可以执行以下两种操作之一:

  • 将字符串转换为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)
    
    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
    
  • 将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")
    

  • 我不确定我是否理解:您的数据帧值是您自己要解析的字符串?
    [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”)这使我能够根据需要获取数据。然后,您可以在下面的表格中自己回答您的问题,这样其他人就可以看到它,而无需深入查看评论。