如何使用PySpark垂直向下遍历DataFrame列并提取指定间隔值
PySpark 筛选col1列间隔数值实现方案
PySpark是分布式计算引擎,不要照搬单机场景逐行遍历的思路处理数据,针对你要获取col1列中10、20、30这类等间隔数值的需求,直接按规则过滤即可,性能远高于逐行遍历。
场景1:按数值间隔筛选(值为10的整数倍)
如果你的需求是直接取col1列中数值为10、20、30这类10的整数倍的记录,直接用取模运算做条件过滤就行,这是性能最高的写法:
from pyspark.sql import functions as F # 定义间隔值,要取10倍值就设为10,后续调整间隔直接改这个参数即可 filter_interval = 10 # 过滤得到所有符合间隔规则的记录 result_df = source_df.filter(F.col("col1") % filter_interval == 0)
如果需要单独遍历拿到这些数值做后续逻辑处理,在结果集数据量不大的前提下,可以拉取到本地遍历:
# 提取符合条件的数值列表 target_nums = [row.col1 for row in result_df.collect()] # 逐值处理 for num in target_nums: # 此处替换为你的自定义处理逻辑 print(f"当前获取到符合规则的数值:{num}")
注意:如果结果集数据量超过10万条,不建议直接用
collect()拉取到本地,容易造成驱动节点内存溢出,可以用foreach算子在分布式节点上执行处理逻辑。
场景2:按行位置间隔筛选(排序后每隔10行取1个值)
如果你的col1存在数值断档,需求是沿col1升序排列后,取第10行、第20行、第30行位置的记录(而非数值本身是10的倍数),需要先打行号再过滤:
from pyspark.sql import functions as F from pyspark.sql.window import Window # 定义按col1升序的全局窗口 sort_window = Window.orderBy("col1") # 给排序后的每行打连续行号 ranked_df = source_df.withColumn("row_idx", F.row_number().over(sort_window)) # 过滤行号符合间隔要求的记录 filter_interval = 10 result_df = ranked_df.filter(F.col("row_idx") % filter_interval == 0)
避坑提示
- 不要写逐行遍历全量数据判断值是否符合规则的逻辑,这种写法会完全放弃PySpark分布式计算的优势,数据量稍大就会出现执行缓慢、任务失败的问题
- 全局开窗打行号的写法会把所有数据拉到单节点做排序,超大数据集下建议先做分桶分区再排序,避免单节点压力过大
内容的提问来源于stack exchange,提问作者Aishani Singh
相关产品推荐
相关产品推荐

