PySpark正则提取:获取line_number:与连字符间的数字
PySpark提取指定数字的实现方法
要从whole_text列中提取line_number:之后、第一个连字符-之前的数字,最可靠的方式是使用正则表达式提取,以下是具体实现:
方法一:正则表达式提取(推荐)
使用PySpark的regexp_extract函数,通过正则精准匹配目标数字:
- 正则规则:
r'line_number:(\d+)-',其中(\d+)专门捕获line_number:后到第一个-之间的所有数字 - 第三个参数
1表示提取正则中第一个捕获组的内容
示例代码
from pyspark.sql import SparkSession from pyspark.sql.functions import regexp_extract # 初始化SparkSession spark = SparkSession.builder.appName("ExtractLineNumber").getOrCreate() # 创建示例数据 data = [ ("text:ABC12637-XYZ line_number:121-ABC:JJ11",), ("header:3AXYZ166-LMN line_number:3112-GHI:3A1",) ] df = spark.createDataFrame(data, ["whole_text"]) # 添加提取结果列 df = df.withColumn("line_num", regexp_extract("whole_text", r'line_number:(\d+)-', 1)) # 查看结果 df.show(truncate=False)
输出结果
+---------------------------------------------+--------+ |whole_text |line_num| +---------------------------------------------+--------+ |text:ABC12637-XYZ line_number:121-ABC:JJ11 |121 | |header:3AXYZ166-LMN line_number:3112-GHI:3A1|3112 | +---------------------------------------------+--------+
方法二:子串截取(适用于固定格式场景)
如果line_number:在文本中的位置相对固定,也可以通过instr和substring组合实现,但灵活性不如正则:
from pyspark.sql.functions import instr, substring df = df.withColumn( "line_num", substring( "whole_text", instr("whole_text", "line_number:") + len("line_number:"), instr("whole_text", "-", instr("whole_text", "line_number:")) - (instr("whole_text", "line_number:") + len("line_number:")) ) )
内容的提问来源于stack exchange,提问作者Rohit Kadam
相关产品推荐
相关产品推荐

