Получить значение из карты для значения столбца в качестве ключа в кадрах данных Spark - PullRequest
0 голосов
/ 29 апреля 2019

Я должен был получить значение из карты из значения столбца в качестве ключа и создать новый столбец

Я пробовал следующий

val testMap = Map("abc" -> "1234", "xyz" -> "3456")

def checkthemap (testmap: Map[String, String], key: String) : String = {
    val value = testmap.get(key)
    if (value == null) "" else value.toString
}

val testDF = analysis
    .withColumn("test", lit(checkthemap(testMap,$"col")))

Метод принимает строку, а не столбец.Как изменить инструкцию withColumn для отправки значения столбца в виде строки в метод.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Принятый ответ очень неэффективен и излишне сложен. Вместо этого вы должны просто обращаться с testMap как с литералом. Импортируйте следующее

import org.apache.spark.sql.functions.{coalesce, lit, typedLit}

преобразовать карту в столбец:

val testMapCol = typedLit(testMap)

и просто выберите:

df.withColumn("value", coalesce(testMapCol($"col"), lit(""))
2 голосов
/ 29 апреля 2019

Я бы предложил использовать UDF (пользовательскую функцию), которая принимает столбец как key для переданной поисковой карты, чтобы вернуть соответствующее значение карты, как показано ниже:

import org.apache.spark.sql.functions._
import spark.implicits._

def getMapValue(m: Map[String, String], defaultValue: String) = udf{
  (key: String) => m.getOrElse(key, defaultValue)
}

val df = Seq(
  (1, "a"), (2, "b"), (3, "c")
).toDF("id", "key")

val lookupMap = Map("a" -> "xx", "c" -> "zz")

df.withColumn("value", getMapValue(lookupMap, "")($"key")).show
// +---+---+-----+
// | id|key|value|
// +---+---+-----+
// |  1|  a|   xx|
// |  2|  b|     |
// |  3|  c|   zz|
// +---+---+-----+

РЕДАКТИРОВАТЬ: см. Другой ответ для решения с использованием встроенных функций Spark, которые обычно работают лучше, чем UDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...