使用 map<string,string> 列类型将 spark DataFrame 保存到 csv 文件

Save spark DataFrame to csv file with map<string,string> column type

我编写了将 Map[String,String] 值转换为 String 的 udf 函数:

 udf("mapToString", (input: Map[String,String]) => input.mkString(","))

spark-shell 给我错误:

    <console>:24: error: overloaded method value udf with alternatives:
  (f: AnyRef,dataType: org.apache.spark.sql.types.DataType)org.apache.spark.sql.expressions.UserDefinedFunction <and> 
...
cannot be applied to (String, Map[String,String] => String)
       udf("mapToString", (input: Map[String,String]) => input.mkString(","))

是否有任何方法可以将 Map[String,String] 值的列转换为字符串值? 我需要这种转换,因为我需要将数据帧保存为 csv 文件

假设您有 DataFrame 作为

+---+--------------+
|id |map           |
+---+--------------+
|1  |Map(200 -> DS)|
|2  |Map(300 -> CP)|
+---+--------------+

具有以下架构

root
 |-- id: integer (nullable = false)
 |-- map: map (nullable = true)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)

你可以写一个 udf 看起来像:

def mapToString = udf((map: collection.immutable.Map[String, String]) => 
                       map.mkString.replace(" -> ", ","))

并使用 udf 函数与 withColumn API 作为

df.withColumn("map", mapToString($"map"))

你应该有最终的 DataFrame 其中 Map 更改为 String

+---+------+
|id |map   |
+---+------+
|1  |200,DS|
|2  |300,CP|
+---+------+

root
 |-- id: integer (nullable = false)
 |-- map: string (nullable = true)