Spark DataFrame如何判断两个字符串列是否存在子串重叠
Spark DataFrame两字符串列公共子串匹配实现方案
方案1:自定义UDF实现(灵活易调整,推荐使用)
直接通过UDF封装公共子串判断逻辑,可自由调整最小匹配子串长度,兼容Scala/PySpark多语言环境,以下为PySpark示例:
from pyspark.sql import functions as F from pyspark.sql.types import BooleanType # min_len为最小公共子串匹配长度,示例设为2,可根据需求修改 def has_common_substr(a: str, b: str, min_len: int = 2) -> bool: # 空字符串、长度不足的字符串直接判定不匹配 if not a or not b or len(a) < min_len or len(b) < min_len: return False # 优先遍历短字符串生成子串,减少计算量 if len(a) > len(b): a, b = b, a # 生成短串所有指定长度的子串去重 substr_set = {a[i:i+min_len] for i in range(len(a) - min_len + 1)} # 检查长串是否包含任意子串 return any(s in b for s in substr_set) # 注册UDF check_common_udf = F.udf(has_common_substr, BooleanType()) # 调用UDF新增匹配结果列 df = df.withColumn("is_match", check_common_udf(F.col("colA"), F.col("colB")))
运行后得到的结果与示例预期一致:id为1的行is_match为True,id为2的行is_match为False。
方案2:内置SQL函数实现(无需自定义UDF,适合纯SQL场景)
通过Spark内置的SEQUENCE、EXISTS高阶函数实现相同逻辑,示例如下:
SELECT id, colA, colB, -- 最小匹配长度为2,若要调整修改所有数值2为目标长度即可 EXISTS( SEQUENCE(0, LENGTH(colA) - 2), i -> INSTR(colB, SUBSTRING(colA, i + 1, 2)) > 0 ) AS is_match FROM 你的表名
性能优化提示:可提前过滤掉
LENGTH(colA) < 最小匹配长度或LENGTH(colB) < 最小匹配长度的行,这类行直接判定为不匹配,可大幅减少无效计算。
内容的提问来源于stack exchange,提问作者user4046073
相关产品推荐
相关产品推荐

