当前位置: 首页 > 知识库问答 >
问题:

如何在数据框中使用Map类型的列并创建一个字符串,该字符串只是Map列的键/值

苏边浩
2023-03-14

我有兴趣在我的数据框中加入一个叫做mapCol列的列

+-------------------+
|   mapColumn       |
 +-------------------+
| Map(KEY -> VALUE) |
 +-------------------+

创建一个stringColumn,它只是Map列的键和值,其中的值是“key,value”:

+-------------------+
|   stringColumn    |
 +-------------------+
| KEY,VALUE         |
 +-------------------

我尝试创建一个UDF来传递这个值,如下所示:

var getStringColumn = udf(mapToString _)

df.withColumn("stringColumn,
               when(col(mapColumn).isNotNull,
                    getStringColumn(col(mapColumn)))
                    .otherwise(lit(null: String)))

def mapToString(row: Row): String = {
    if (null == row || row.isNullAt(FirstItemIndex)) {
        return null
    }
    return row.getValuesMap[Any](row.schema.fieldNames).mkString(",")
    }

我不断发现以下错误:

无法执行用户定义的函数($anonfun$1:(映射)=

共有1个答案

季炯
2023-03-14

没有必要设立UDF。一种方法是映射列分解成扁平的

val df = Seq(
  (10, Map((1, "a"), (2, "b"))),
  (20, Map((3, "c")))
).toDF("id", "map")

df.
  select($"id", explode($"map")).
  withColumn("kv_string", concat($"key".cast("string"), lit(","), $"value")).
  show
// +---+---+-----+---------+
// | id|key|value|kv_string|
// +---+---+-----+---------+
// | 10|  1|    a|      1,a|
// | 10|  2|    b|      2,b|
// | 20|  3|    c|      3,c|
// +---+---+-----+---------+

 类似资料: