首页 > 解决方案 > 多个正则表达式在scala中一起替换

问题描述

我在 scala 中将一个数据框作为输入,该数据框有一个名为vin的列。该列具有以下格式的值

1. UJ123QR8467
2. 0UJ123QR846
3. /UJ123QR8467
4. -UJ123QR8467

等等。

要求是根据以下规则清洁列 vin。

1. replace **"/_-** as ""
2. replace first 0 as ""
3. if the value is more than 10 characters then make the value as NULL.

我想知道是否有任何简化的方法来实现上述目标。我只能想到每次在正则表达式替换期间做多个 .withcolumn 。

标签: scalaapache-spark

解决方案


我会将所有Regex相关更改合并到一个转换中,并将length条件合并到另一个转换中,如下所示:

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

val df = Seq(
  "UJ123QR8467", "0UJ123QR846", "/UJ123QR8467",
  "-UJ123QR8467", "UJ0123QR84", "UJ123-QR_846"
).toDF("vin")

df.
  withColumn("vin2", regexp_replace($"vin", "^[0]|[/_-]", "")).
  withColumn("vin2", when(length($"vin2") <= 10, $"vin2")).
  show
// +------------+----------+
// |         vin|      vin2|
// +------------+----------+
// | UJ123QR8467|      null|
// | 00UJ123QR84|0UJ123QR84|
// |/UJ123QR8467|      null|
// |-UJ123QR8467|      null|
// |  UJ0123QR84|UJ0123QR84|
// |UJ123-QR_846|UJ123QR846|
// +------------+----------+

请注意,我稍微扩展了示例数据集以涵盖诸如非领先的情况0[/_-].


推荐阅读