使用scala将字符串值转换为映射

时间:2019-03-21 13:35:45

标签: scala apache-spark dataframe dictionary user-defined-functions

我有一个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的帮助。

1 个答案:

答案 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)