Scala+Spark环境下DataFrame如何实现多字符串like模糊匹配
实现方案
方案1:使用reduce拼接OR条件(推荐)
这种方法完全兼容Spark原生的like语法,无需额外转义通配符,规则写法和SQL的like完全一致,适配所有场景:
import org.apache.spark.sql.functions._ val df = sc.parallelize(Seq(("Apple"),("Banana"),("Graphes"),("Pineapple"))).toDF("col1") val s = Seq("Ban%","Grap%") // 把所有模糊规则拼接为OR条件 val filterCondition = s.map(pattern => col("col1").like(pattern)).reduce(_ || _) val resultDf = df.filter(filterCondition) resultDf.show()
执行输出结果:
+-------+ | col1| +-------+ | Banana| |Graphes| +-------+
方案2:转换为正则使用rlike算子
如果你的模糊规则只有%作为通配符,可以把规则转换为正则表达式,用rlike实现匹配:
import org.apache.spark.sql.functions._ val df = sc.parallelize(Seq(("Apple"),("Banana"),("Graphes"),("Pineapple"))).toDF("col1") val s = Seq("Ban%","Grap%") // 将like的%通配符替换为正则的.*,用|拼接多个规则 val regex = s.map(_.replace("%", ".*")).mkString("|") val resultDf = df.filter(col("col1").rlike(regex)) resultDf.show()
注意:如果匹配规则中包含SQL like的单字符通配符
_,需要额外替换为正则的.;如果规则中包含正则特殊字符(如.、+、*、?等),需要先做转义处理,避免匹配结果不符合预期。
内容的提问来源于stack exchange,提问作者NEELAMADHAB
相关产品推荐
相关产品推荐

