Scala中如何从DataFrame列中移除列表指定元素?
从DataFrame列中移除指定列表元素的Scala解决方案
嘿,刚接触Scala和Spark的话,这个需求其实挺常见的,我来一步步教你怎么实现!
首先,你的核心需求是:把DataFrame的description列里属于指定名字列表的单词移除,同时保留其他内容。我们可以利用Spark的内置函数高效完成这个操作,不需要写复杂的UDF(当然也可以用,但内置函数更简洁)。
步骤分解
- 准备精准匹配的正则表达式:为了避免误删包含目标名字的更长单词(比如不会把"danielson"里的"daniel"删掉),我们需要给列表里的每个名字加上单词边界标记
\\b,再用|把多个名字拼接成正则规则。比如列表{"harry", "daniel"}对应的正则是\\b(harry|daniel)\\b。 - 用内置函数处理文本:先用
regex_replace把匹配到的目标名字替换为空,再清理替换后可能出现的连续空格,最后去掉字段首尾的多余空格,保证结果和你期望的一致。
完整代码示例
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object RemoveTargetNames { def main(args: Array[String]): Unit = { // 初始化SparkSession val spark = SparkSession.builder() .appName("RemoveNamesFromDF") .master("local[*]") .getOrCreate() import spark.implicits._ // 创建你的输入DataFrame val inputDF = Seq( (12342, "my name is daniel"), (2345, "my name is harry and i love sports"), (2122, "his wife sofia is my schoolmate") ).toDF("utid", "description") // 指定需要移除的名字列表 val namesToRemove = List("harry", "daniel") // 拼接成正则匹配规则 val regexPattern = "\\b(" + namesToRemove.mkString("|") + ")\\b" // 处理DataFrame,生成最终结果 val outputDF = inputDF.withColumn( "description", // 先替换目标名字,再合并连续空格,最后清理首尾空格 trim(regex_replace(regex_replace(col("description"), regexPattern, ""), "\\s+", " ")) ) // 查看输出结果 outputDF.show(false) } }
代码细节说明
regex_replace(col("description"), regexPattern, ""):精准匹配并移除列表里的名字。regex_replace(..., "\\s+", " "):把替换后出现的多个连续空格(比如"my name is ")合并成单个空格。trim(...):去掉字段首尾的空格,让结果完全符合你的期望(比如把"my name is "变成"my name is")。
运行结果
执行代码后,你会得到和需求完全一致的输出:
+-----+-----------------------------------+ |utid |description | +-----+-----------------------------------+ |12342|my name is | |2345 |my name is and i love sports | |2122 |his wife sofia is my schoolmate | +-----+-----------------------------------+
如果你的名字列表里包含正则特殊字符(比如带点、下划线的名字),记得提前对这些字符做转义处理哦,不过一般英文名字不需要额外操作~
内容的提问来源于stack exchange,提问作者nitesh jha
相关产品推荐
相关产品推荐

