如何在Python/PySpark中拆分多分隔符字符串并生成三个指定列表?
解决方案
首先修正你原代码中的错误:row.split(".")没有将拆分结果保存到变量,导致后续操作还是基于原字符串,这会在复杂场景下出错。下面是完整的实现代码:
p1 = "<path_to_parquet file>" df_ref_parquet = spark.read.option('header', True).parquet(p1) # 获取原始字符串列表(你提到的第一个列表) original_list = [x["FILList"] for x in df_ref_parquet.rdd.collect()] fil_cd_left = [] right_part_list = [] middle_part_list = [] for s in original_list: parts = s.split(".") # 处理左侧前4个字符的列表:取拆分后第一个元素,切片前4位,不足4位则取全部 left_part = parts[0][:4] fil_cd_left.append(left_part) # 处理最右侧部分的列表:直接取拆分结果的最后一个元素 right_part = parts[-1] right_part_list.append(right_part) # 处理两个分隔符之间的部分:仅当拆分后有3个元素时取中间值,否则为空字符串 middle_part = parts[1] if len(parts) == 3 else "" middle_part_list.append(middle_part) # 打印结果 print("左侧前4字符列表:", fil_cd_left) print("最右侧部分列表:", right_part_list) print("中间部分列表:", middle_part_list)
代码说明
- 拆分字符串:
split(".")将每个字符串拆分为列表,例如"cvbn.poiu.sdfg"会被拆分为["cvbn", "poiu", "sdfg"] - 左侧前4字符:取拆分后的第一个元素,用
[:4]切片,兼容第一个元素长度不足4的情况 - 最右侧部分:通过
parts[-1]直接获取最后一段,无论字符串包含几个分隔符都能正确取值 - 中间部分:判断拆分后的列表长度,仅当存在两个分隔符(列表长度为3)时取中间元素,否则设为空字符串,你也可以根据需求改为
None
更高效的PySpark原生实现(推荐)
直接用collect()将数据拉到本地处理会浪费集群资源,大数据场景下建议用PySpark内置函数在DataFrame层面处理:
from pyspark.sql.functions import split, element_at, substring, when, size df = spark.read.option('header', True).parquet(p1) processed_df = df.select( "FILList", # 左侧前4字符 substring(split("FILList", "\\.").getItem(0), 1, 4).alias("left_part"), # 最右侧部分 element_at(split("FILList", "\\."), -1).alias("right_part"), # 中间部分 when(size(split("FILList", "\\.")) == 3, split("FILList", "\\.").getItem(1)).otherwise("").alias("middle_part") ) # 导出为列表 original_list = [row["FILList"] for row in processed_df.collect()] fil_cd_left = [row["left_part"] for row in processed_df.collect()] right_part_list = [row["right_part"] for row in processed_df.collect()] middle_part_list = [row["middle_part"] for row in processed_df.collect()]
内容的提问来源于stack exchange,提问作者user3521180
相关产品推荐
相关产品推荐

