Вы довольно близки, но похоже, что ваш UDF имеет некоторую смесь scala и python, и логика синтаксического анализа требует небольшой работы.Может быть лучший способ для анализа строки литерала карты, но это работает с предоставленным примером:
val convertToMap = udf { (pMap: String) =>
val stg = pMap.substring(4, pMap.length() - 1)
val stg1 = stg.split(",").toList.map(_.trim)
val mp = stg1.map(_.split(" ").toList)
mp.map(mp =>(mp(0), mp(2))).toMap
}
val df = spark.createDataset(Seq("Map(12345 -> 45678, 23465 -> 9876)")).toDF("strMap")
С исправленным UDF вы просто вызываете его с помощью .select()
или .withColumn()
:
df.select(convertToMap($"strMap").as("map")).show(false)
Что дает:
+----------------------------------+
|map |
+----------------------------------+
|Map(12345 -> 45678, 23465 -> 9876)|
+----------------------------------+
Со схемой:
root
|-- map: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)