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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:27:22