从映射中获取列值的值作为 spark 数据帧中的键

Kis*_*mar 5 scala dataframe apache-spark

我要从列值的映射中获取一个值作为键并创建一个新列

我已经尝试了以下

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")))
Run Code Online (Sandbox Code Playgroud)

方法接受字符串而不是列。如何更改我的 withColumn 语句以将列值作为字符串发送到方法。

小智 12

接受的答案非常低效且不必要地复杂。相反,您应该将其testMap视为文字。导入以下内容

import org.apache.spark.sql.functions.{coalesce, lit, typedLit}
Run Code Online (Sandbox Code Playgroud)

将地图转换为列:

val testMapCol = typedLit(testMap)
Run Code Online (Sandbox Code Playgroud)

只需选择:

df.withColumn("value", coalesce(testMapCol($"col"), lit(""))
Run Code Online (Sandbox Code Playgroud)


Leo*_*o C 2

我建议使用 UDF(用户定义函数),将列作为key传入的查找 Map 返回相应的 Map 值,如下所示:

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|
// +---+---+-----+
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅使用内置 Spark 函数的解决方案的其他答案,该函数通常比 UDF 性能更好。