用另一个字符串替换regex模式是可行的,但是用none替换将替换所有值

vcirk6k6  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(350)

我正在尝试用空值替换列中以“del”开头的所有字符串。
我试过这个:

customer_details = customer_details.withColumn("phone_number", F.regexp_replace("phone_number", "DEL_.*", ""))

其工作原理与预期一致,新列现在如下所示:

+--------------+
|  phone_number|
+--------------+
|00971585059437|
|00971559274811|
|00971559274811|
|              |
|00918472847271|
|              |
+--------------+

但是,如果我将代码更改为:

customer_details = customer_details.withColumn("phone_number", F.regexp_replace("phone_number", "DEL_.*", None))

现在将替换列中的所有值:

+------------+
|phone_number|
+------------+
|        null|
|        null|
|        null|
|        null|
|        null|
|        null|
+------------+
5w9g7ksd

5w9g7ksd1#

试试这个-
斯卡拉

df.withColumn("phone_number", when(col("phone_number").rlike("^DEL_.*"), null)
          .otherwise(col("phone_number"))
      )

python

df.withColumn("phone_number", when(col("phone_number").rlike("^DEL_.*"), None)
          .otherwise(col("phone_number"))
      )
``` `Update` 查询-
你能解释一下为什么我原来的解决方案不起作用吗? `customer_details.withColumn("phone_number", F.regexp_replace("phone_number", "DEL_.*", None))` ans—所有三元表达式(包含3个参数的函数)都是 `null-safe` . 也就是说如果spark发现了任何一个论点 `null` ,它确实会返回null而不进行任何实际处理(例如,regexp\u replace的模式匹配)。你可能想看看这张spark回购的照片

override def eval(input: InternalRow): Any = {
val exprs = children
val value1 = exprs(0).eval(input)
if (value1 != null) {
val value2 = exprs(1).eval(input)
if (value2 != null) {
val value3 = exprs(2).eval(input)
if (value3 != null) {
return nullSafeEval(value1, value2, value3)
}
}
}
null
}

相关问题