You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark解析含表头与空行的文本文件:提取花卉缩写方法咨询

用PySpark提取花卉缩写的实现方案

嘿,作为PySpark新手,这个需求其实很容易搞定,我给你一步步拆解实现步骤,附带完整代码示例:

第一步:读取文本文件

首先咱们用PySpark的text()方法读取文本文件,它会把每一行作为一个单独的记录加载:

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("ExtractFlowerAbbr").getOrCreate()

# 读取文本文件,替换成你的文件实际路径
df = spark.read.text("/path/to/your/flower_file.txt")

第二步:过滤掉无关行

你的文件里有分隔线、空行和表头行,咱们需要把这些过滤掉,只保留包含花卉信息的核心行:

# 过滤空行、分隔线行(包含---------)和表头行(包含Plantes Abbreviations)
filtered_df = df.filter(
    ~df.value.isNull() 
    & ~df.value.contains("---------") 
    & ~df.value.contains("Plantes Abbreviations")
)

第三步:提取花卉缩写

这里给你两种常用方法,你可以根据实际情况选择:

方法1:按空格分割后提取(适合固定格式)

观察有效行的结构:Flowers: ro rose ni Nilofar da Dahlia,按空格分割后,缩写正好是第2、4、6个元素(索引从0开始对应1、3、5),咱们可以用split()函数实现:

from pyspark.sql.functions import split, element_at, stack

# 分割每行文本为数组
split_df = filtered_df.withColumn("split_values", split(df.value, " "))

# 提取所有缩写元素并转成单列
abbr_df = split_df.select(
    element_at(split_df.split_values, 2).alias("abbr"),
    element_at(split_df.split_values, 4).alias("abbr"),
    element_at(split_df.split_values, 6).alias("abbr")
).selectExpr("stack(3, abbr, abbr, abbr) as abbr").distinct()

方法2:用正则表达式提取(更灵活)

如果后续缩写的位置或格式可能变化,用正则匹配两个小写字母的缩写会更稳妥:

from pyspark.sql.functions import regexp_extract_all, explode

# 提取所有符合"两个小写字母"格式的缩写
abbr_df = filtered_df.withColumn(
    "abbr_list", regexp_extract_all(df.value, r"\b[a-z]{2}\b", 0)
).select(explode("abbr_list").alias("abbr"))

第四步:收集结果为列表

最后把提取到的缩写收集成Python列表:

flower_abbr_list = [row.abbr for row in abbr_df.collect()]
print(flower_abbr_list)  # 输出: ['ro', 'ni', 'da']

完整代码整合

把上面的步骤整合起来,就是完整的可运行代码:

from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_extract_all, explode

# 初始化SparkSession
spark = SparkSession.builder.appName("ExtractFlowerAbbr").getOrCreate()

# 读取文本文件
df = spark.read.text("/path/to/your/flower_file.txt")

# 过滤无关行
filtered_df = df.filter(
    ~df.value.isNull() 
    & ~df.value.contains("---------") 
    & ~df.value.contains("Plantes Abbreviations")
)

# 用正则提取缩写并转成列表
abbr_df = filtered_df.withColumn(
    "abbr_list", regexp_extract_all(df.value, r"\b[a-z]{2}\b", 0)
).select(explode("abbr_list").alias("abbr"))

flower_abbr_list = [row.abbr for row in abbr_df.collect()]
print(flower_abbr_list)

# 停止SparkSession
spark.stop()

这个方案既适配了当前的固定格式,也用正则做了灵活扩展,适合你作为新手学习和使用~

内容的提问来源于stack exchange,提问作者sara jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:40:26