PySpark教程:如何在DataFrame的Ident列中应用正则表达式?
PySpark DataFrame Ident列正则转换实现方案
需求说明
需要对PySpark DataFrame的Ident列应用正则表达式完成转换,规则如下:
- 匹配到
15/19时,转换为'S15/19' - 匹配到
14/11时,转换为'S11/14'(数字部分反转) - 匹配到
HPD时,转换为'HPD' - 匹配到
PTG时,转换为'PTG'
示例数据
原DataFrame:
+-------------+ | Ident | +-------------+ |SAS 15/19 USA| +-------------+ |SHS 14/11 ENG| +-------------+ |SGS HPD FRA| +-------------+ |SSS PTG ALL| +-------------+
期望生成的new_col列:
+-------------+ | new_col | +-------------+ | S15/19 | +-------------+ | S11/14 | +-------------+ | HPD | +-------------+ | PTG | +-------------+
实现代码
通过when条件分支结合regexp_extract、regexp_replace实现精准匹配与转换:
from pyspark.sql import SparkSession from pyspark.sql.functions import when, regexp_extract, regexp_replace # 初始化SparkSession spark = SparkSession.builder.appName("IdentTransform").getOrCreate() # 创建示例DataFrame data = [ ("SAS 15/19 USA",), ("SHS 14/11 ENG",), ("SGS HPD FRA",), ("SSS PTG ALL",) ] df = spark.createDataFrame(data, ["Ident"]) # 生成new_col列 df_transformed = df.withColumn( "new_col", when(regexp_extract("Ident", r"15/19", 0) == "15/19", "S15/19") .when(regexp_extract("Ident", r"14/11", 0) == "14/11", regexp_replace("Ident", r".*(\d+)/(\d+).*", "S$2/$1")) .when(regexp_extract("Ident", r"HPD", 0) == "HPD", "HPD") .when(regexp_extract("Ident", r"PTG", 0) == "PTG", "PTG") ) # 查看转换结果 df_transformed.select("new_col").show()
代码说明
- 处理15/19模式:用
regexp_extract精准匹配目标字符串,匹配成功直接返回S15/19 - 处理14/11模式:通过正则捕获组
(\d+)/(\d+)提取数字段,再用regexp_replace交换两个分组的位置,拼接成S11/14 - 处理HPD/PTG模式:直接提取目标字符串并返回原值
内容的提问来源于stack exchange,提问作者elokema
相关产品推荐
相关产品推荐

