使用Map替换Spark中的列值

mrb*_*chi 1 scala apache-spark apache-spark-sql

我必须将列列表映射到Spark数据集中的另一列:这样思考

val translationMap: Map[Column, Column] = Map(
  lit("foo") -> lit("bar"),
  lit("baz") -> lit("bab")
)
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的数据框:

val df = Seq("foo", "baz").toDF("mov")
Run Code Online (Sandbox Code Playgroud)

所以我打算像这样执行翻译:

df.select(
  col("mov"),
  translationMap(col("mov"))
)
Run Code Online (Sandbox Code Playgroud)

但是这段代码会吐出以下错误

key not found: movs
java.util.NoSuchElementException: key not found: movs
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在不连接数百个whens的情况下执行此类转换?认为translationMap可能会有很多对键值。

use*_*362 5

而不是Map[Column, Column]您应该使用Column包含地图文字的:

import org.apache.spark.sql.functions.typedLit

val translationMap: Column = typedLit(Map(
  "foo" -> "bar",
  "baz" -> "bab"
))
Run Code Online (Sandbox Code Playgroud)

您的其余代码可以保持原样:

df.select(
  col("mov"),
  translationMap(col("mov"))
).show
Run Code Online (Sandbox Code Playgroud)
import org.apache.spark.sql.functions.typedLit

val translationMap: Column = typedLit(Map(
  "foo" -> "bar",
  "baz" -> "bab"
))
Run Code Online (Sandbox Code Playgroud)

  • @mrbolichi, `coalesce(translationMap(col("mov")), col("mov"))` 将按照您想要的方式处理不匹配的键。 (4认同)