scala - 将 Spark DataFrame 保存到具有 map<string,string> 列类型的 csv 文件

标签 scala apache-spark apache-spark-sql user-defined-functions scala-collections

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

 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)

关于scala - 将 Spark DataFrame 保存到具有 map<string,string> 列类型的 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46342662/

相关文章:

scala - 将 RDD 拆分为没有重复值的 RDD

Scala:通过包外的结构类型访问包可见方法

apache-spark - 将 Tensorflow 模型的预测输出保存到 hdfs 文件中

apache-spark - 使用pyspark建立与drill的连接

scala - 为什么在 Structured Streaming 中,transform 只执行一次副作用(println)?

scala - 如何使用结构化流从 Kafka 读取 JSON 格式的记录?

scala - 我可以在 Scala 中从一组非逗号分隔的标记创建元组吗?

scala - 如何使用specs2检查Future[Seq[T]]是否为空

r - 在Hadoop服务器上分配R处理

apache-spark - Spark : What is the difference between repartition and repartitionByRange?