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
相关产品推荐
相关产品推荐

