我有一个CSV文件,其中包含一个带有地图的字段,如下所述 “地图(12345-> 45678,23465-> 9876)”
当我尝试将csv加载到数据帧中时,它会将其视为字符串。 因此,我写了一个UDF将字符串转换为映射,如下所示:
var current = $(location).attr('href');
$('.menu_mainitem').toggleClass('active', function() {
return $(this).find('a').attr('href').indexOf(current) !== -1;
});
现在,我需要将UDF应用于被当作字符串的列并返回带有已转换列的DF的帮助。
答案 0 :(得分:1)
您已经很接近了,但是看起来您的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)