Как объединить несколько столбцов в MapType в Spark? - PullRequest
0 голосов
/ 23 февраля 2020

Предположим, у меня есть DataFrame, подобный этому

val df = Seq((1, 2), (3, 4)).toDF("a", "b")
df.show()

+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  3|  4|
+---+---+

Я хочу объединить 2 столбца в один столбец с MapType, чтобы быть похожим на это:

+----------+
|params    |
+----------+
|a->1, b->2|
|a->3, b->4|
+----------+

Как можно Я так делаю?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Мы также можем сгенерировать выражение карты во всех столбцах кадра данных, используя .map и .mkString

Затем передайте выражение в .selectExpr пункт.

//Sample data
df.show()
//+---+----+
//| id|name|
//+---+----+
//|  1|   a|
//|  2|   b|
//+---+----+

//generate map expr on all columns of dataframe
val map_expr=df.columns.map( v => s""""$v",$v""").mkString("map(",",",")as params")

//pass the map_expr to selectExpr to get required output field.
df.selectExpr(s"$map_expr").show()

//+--------------------+
//|              params|
//+--------------------+
//|[id -> 1, name -> a]|
//|[id -> 2, name -> b]|
//+--------------------+
0 голосов
/ 23 февраля 2020

Я не уверен, что это лучший способ сделать это или нет, но я смог сделать это, используя functions.map

import org.apache.spark.sql.functions

def columnsToMap(name: String, columns: Column*): Column = {
  val columnsWithNames = columns.flatMap(column => Seq(lit(column.toString()), column))
  functions.map(columnsWithNames:_*).as(name)
}

val m = df.select(columnsToMap("params", df("a"), df("b")))
m.show()
+----------------+
|          params|
+----------------+
|[a -> 1, b -> 2]|
|[a -> 3, b -> 4]|
+----------------+
...