scala - 多个正则表达式在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 。
解决方案
我会将所有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
,[/_-]
.
推荐阅读
- java - 什么是用于搜索的 Retrofit OR 运算符
- java - 无法从 swt 中的表中删除表项
- python - 如何在不使用任何库或函数的情况下替换 python 中的单词
- git - git pull origin
创建 index.lock? - mongodb - MongoDB Compass 社区中的空白
- mysql - 如何返回特定总和的最后一行?
- javascript - 如何在点上应用渐变蒙版
- kubernetes - Spring GCP 服务未连接到 Cloud SQL 数据库
- c# - System.Net.Http.HttpRequestException(使用 REST API 时)
- android - Android 数据绑定不适用于 androidX