Pyspark如何拆分DataFrame单列 保留科目为同一列单独提取name与age
PySpark实现拆分指定字段保留其余内容方案
该需求完全可以在PySpark中实现,推荐使用正则匹配提取的方案,不受键值对顺序影响,代码简洁执行效率高,具体实现如下:
完整实现代码
# 导入需要的Spark函数 from pyspark.sql import functions as F # --------------- 以下是模拟你的原始DataFrame,实际使用时可以替换为你自己的df --------------- data = [ ("Physics=99;name=Xxxx;age=15",), ("Physics=97;chemistry=85;name=yyyy;age=14",), ("Physics=97;chemistry=85;maths=65;name=zzzz;age=14",) ] df = spark.createDataFrame(data, ["Column_1"]) # --------------------------------------------------------------------------------------- # 提取name字段 df = df.withColumn("name", F.regexp_extract("Column_1", r"name=([^;]+)", 1)) # 提取age字段并转为整数类型 df = df.withColumn("age", F.regexp_extract("Column_1", r"age=([^;]+)", 1).cast("int")) # 清理原Column_1中的name、age相关键值对,仅保留科目内容 df = df.withColumn("Column_1", F.regexp_replace(F.regexp_replace("Column_1", r";?name=[^;]+", ""), r";?age=[^;]+", "")) # 查看结果 df.show(truncate=False)
输出结果验证
执行后输出和你预期的效果完全一致:
+---------------------------------+----+---+ |Column_1 |name|age| +---------------------------------+----+---+ |Physics=99 |Xxxx|15 | |Physics=97;chemistry=85 |yyyy|14 | |Physics=97;chemistry=85;maths=65 |zzzz|14 | +---------------------------------+----+---+
逻辑说明
- 用
regexp_extract函数匹配固定格式的name=、age=后缀内容,直接提取出对应字段值,不受键值对在字符串中位置的影响 - 用两次
regexp_replace分别删除原字符串中name和age的键值对,自动清理多余的分号,剩下的内容就是所有科目相关的键值对
内容的提问来源于stack exchange,提问作者Padfoot123
相关产品推荐
相关产品推荐

