PySpark非空DataFrame调用sample返回空DataFrame的原因排查
PySpark抽样空DataFrame问题解决
你的问题出在对PySpark sample 方法的参数理解偏差:fraction 参数是单条数据被选中的概率,不是精确的抽样比例。
当你的DataFrame只有6行时,设置 fraction=1/6 意味着每一行仅有1/6的概率被抽取,概率事件本身就存在「连续6次都没命中」的可能——而你固定了seed=42,这次随机数生成刚好触发了这个小概率事件,导致返回空DataFrame。
可靠的解决方法
方法1:用
takeSample直接抽取指定数量(最适合小数据集)takeSample是行动算子,直接返回指定数量的样本列表,完全避免概率空抽的问题:# 抽取1条不重复样本,固定随机种子 sample_list = centroids.takeSample(withReplacement=False, num=1, seed=42) # 转换为DataFrame sample_row = spark.createDataFrame(sample_list, schema=centroids.schema)方法2:随机排序后取首行
通过生成随机数排序,确保必取到一行数据:from pyspark.sql.functions import rand sample_row = centroids.orderBy(rand(seed=42)).limit(1)方法3:调整
sample的概率值(不推荐)
若坚持用sample,可把fraction设为更大的值(比如0.5)再取首行,但仍存在极小概率空抽:sample_row = centroids.sample(withReplacement=False, fraction=0.5, seed=42).limit(1)
内容的提问来源于stack exchange,提问作者Sara Munafò
相关产品推荐
相关产品推荐

