Spark合并DataFrame后如何随机抽取行?limit结果固定问题
Spark DataFrame 随机抽取行的解决方案
limit方法仅会从DataFrame的起始位置取指定行数,不会打乱数据原有顺序,因此每次执行都会得到相同结果,这是预期行为。要实现随机抽取行,可使用以下两种方法:
方法1:使用sample函数
sample支持按比例随机抽样,可选择放回/不放回模式,适合按比例取数的场景,也可结合limit获取固定行数:
# 不放回抽样,抽取10%的数据,seed设为None则每次结果随机 sampled_df = merged_df.sample(withReplacement=False, fraction=0.1, seed=None) # 抽取固定10行 random_choices_df = sampled_df.limit(10) random_choices_df.show()
若需要可复现的随机结果,给seed传入固定数值即可(比如seed=42)。
方法2:基于随机数排序后取数
为每行生成随机数并按其排序,再用limit取前N行,实现随机抽取:
from pyspark.sql.functions import rand # 按随机数打乱顺序后取10行 random_choices_df = merged_df.orderBy(rand()).limit(10) random_choices_df.show()
同样,rand()可传入固定seed值(如rand(100))得到可复现结果,不传参数则每次抽取结果不同。
单机环境下上述两种方法均可正常运行,无需额外配置。
内容的提问来源于stack exchange,提问作者lapots
相关产品推荐
相关产品推荐

