【问题标题】:Save spark DataFrame to csv file with map<string,string> column type使用 map<string,string> 列类型将 spark DataFrame 保存到 csv 文件
【发布时间】:2018-03-02 17:33:04
【问题描述】:

我已经编写了将 Map[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 文件

【问题讨论】:

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


    【解决方案1】:

    假设你有一个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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2018-03-22
      • 2020-06-09
      • 2021-08-09
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多