【问题标题】:Spark/Scala transform [map of array] to [map of map]Spark/Scala 将 [map of array] 转换为 [map of map]
【发布时间】:2023-02-02 13:46:35
【问题描述】:

我希望更改数据存储在我的数据框列之一中的方式。

content-value 列目前有这种类型:

 |-- content-value: map (nullable = true)
 |    |-- key: integer
 |    |-- value: array (valueContainsNull = true)
 |    |    |-- element: string (containsNull = true)

数据目前是这样存储的:

{4 -> [5191, 57, -46, POS2], 5 -> [5413, 56, 48, POS2], 2 -> [5421, -59, 47, POS2], 1 -> [5237, -59, -47, POS2], 3 -> [5153, -10, 42, POS1]} 

我想将其更改为看起来像的地图地图:

{4 -> {value -> 5191, x -> 57, y -> -46, pos -> POS2}, 5 -> {value -> 5413, x -> 56, y -> 48, pos -> POS2}, 2 -> {value -> 5421, x -> -59, y -> 47, pos -> POS2}, 1 -> {value -> 5237, x -> -59, y -> -47, pos -> POS2}, 3 -> {value -> 5153, x -> -10, y -> 42, pos -> POS1}} 

我尝试使用键 ["value", "x", "y", "pos"] 创建一个新列并使用 map_from_array 但没有成功。

会喜欢一些帮助!

【问题讨论】:

    标签: scala apache-spark pyspark


    【解决方案1】:

    使用数据集:

    import spark.implicits._
    
    case class Value(value: String, x: String, y: String, pos: String)
    
    val ds = spark.createDataset[Map[Int, Array[String]]](Seq(Map(4 -> Array("5191", "57", "-46", "POS2"))))
    
    val dsFinal = 
      ds.map(el => el.flatMap {
         case (key, value) => Map(key -> Value(value(0), value(1), value(2), value(3)))})
    

    它给:

    +----------------------------+
    |value                       |
    +----------------------------+
    |{4 -> {5191, 57, -46, POS2}}|
    +----------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      相关资源
      最近更新 更多