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

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ò

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:22:12