PySpark中基于另一列动态替换正则占位符提取字符串问题
PySpark动态替换正则占位符提取匹配内容
解决方案:动态拼接正则表达式字符串
PySpark的regexp_extract虽要求正则参数为字符串,但可通过列拼接生成每行对应的动态正则,再传入函数完成提取。
1. 创建示例数据
from pyspark.sql import SparkSession from pyspark.sql.functions import col, regexp_extract, concat, lit, format_string spark = SparkSession.builder.appName("DynamicRegex").getOrCreate() # 模拟输入数据 data = [ ("SRC_INFO", "something SRC_INFO_S_3_DOOR"), ("SRC_USER", "test SRC_USER_X_789_FRAME") ] df = spark.createDataFrame(data, ["SourceName", "Message"])
2. 方法一:用concat拼接正则
通过concat将SourceName列与正则固定部分拼接,生成每行专属的正则表达式:
df = df.withColumn( "code", regexp_extract( col("Message"), # 拼接正则:匹配 {SourceName}_S_数字_DOOR 格式,提取数字 concat(lit(".*"), col("SourceName"), lit("_S_(\\d+)_DOOR.*")), 1 # 提取第一个分组的内容(即数字) ) ) df.show()
3. 方法二:用format_string简化拼接
format_string支持占位符替换,写法更简洁:
df = df.withColumn( "code", regexp_extract( col("Message"), format_string(".*%s_S_(\\d+)_DOOR.*", col("SourceName")), 1 ) ) df.show()
输出结果
+----------+--------------------+----+ |SourceName| Message|code| +----------+--------------------+----+ | SRC_INFO|something SRC_INFO...| 3| | SRC_USER|test SRC_USER_X_78...| | +----------+--------------------+----+
(第二行因不匹配_S_数字_DOOR格式返回空字符串,可根据需求调整正则逻辑)
关键说明
- 核心思路是利用PySpark列表达式动态生成正则字符串,而非传入固定常量
- 若需匹配不同模式,只需修改
concat或format_string中的正则模板即可
内容的提问来源于stack exchange,提问作者Arpan Sarkar
相关产品推荐
相关产品推荐

