首页 > 解决方案 > 在 Spark 数据帧的 when 子句中使用 contains

问题描述

我有以下 DS 和 DF 的工作声明:

val ds2 = ds.withColumn("new_telnum", 
             when(expr("substring(telnum,1,2)") === "91" || 
                  expr("substring(telnum,1,2)") === "01", 
                  expr("substring(telnum,3,length(telnum)-2)"))
            .otherwise(col("telnum")))

但是,我似乎无法将when表达式转换为使用 aListcontains构造来替换or.

标签: scalaapache-spark

解决方案


我建议使用isin,如下例所示:

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

val ds = Seq(
  ("012223334444"),
  ("1112223333"),
  ("913334445555"),
  ("884445556666")
).toDF("telnum").as[(String)]

val codeList = List("91", "01")

ds.withColumn( "new_telnum", when( substring($"telnum", 1, 2).isin(codeList: _*),
    expr("substring(telnum, 3, length(telnum) - 2)")
  ).otherwise($"telnum")
).show
// +------------+------------+
// |      telnum|  new_telnum|
// +------------+------------+
// |012223334444|  2223334444|
// |  1112223333|  1112223333|
// |913334445555|  3334445555|
// |884445556666|884445556666|
// +------------+------------+

推荐阅读