Spark выберите столбцы в кадре данных, используя карту с ключом -> имя столбца - PullRequest
1 голос
/ 27 февраля 2020

Я работаю над Apache spark 2.3.0 cloudera4, и у меня возникла проблема с выбором столбца c в зависимости от значения на карте.

У меня есть эти входные данные, фрейм данных:

+---+---+---+...+
| id| c1| c2| cN|
+---+---+---+...+
|  a|1.0|2.0|...|
|  a|3.0|4.0|...|
|  b|5.0|6.0|...|
|  c|7.0|8.0|...|
+---+---+---+---+

Каждый столбец "c" имеет двойной тип.

И карта:

Map("a" -> "c1", "b" -> "c2", "c" -> "c1")

Мне нужен этот вывод:

+---+---+
| id|  c|
+---+---+
|  a|1.0|
|  a|3.0|
|  b|6.0|
|  c|7.0|
+---+---+

Каков наилучший способ, с точки зрения производительности, получить выходные данные?

Теперь я перебираю ключ карты, выбираю столбец значений col и id с предложением where и выполняю объединение с предыдущим шагом (первый шаг выполняется с использованием пустого кадра данных). Я думаю, что такого рода операции снижают производительность моего процесса.

1 Ответ

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

Здесь не нужно использовать union, итерации переменной карты вместе с coalesce должно быть достаточно. Это выберет правильный столбец в зависимости от значения в столбце id и словаре:

import spark.implicits._

val m = Map("a" -> "c1", "b" -> "c2", "c" -> "c1")
val c = coalesce(m.map{case (k,v) => when($"id" === k, col(v)).otherwise(lit(null))}.toSeq: _*)

df.select($"id", c)
...