pyspark 为什么一个非空的框架上的sample属性返回空的框架?

wz1wpwve  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(130)

我在pySpark中有一个名为centroids的非空的嵌套框架,我必须从中抽取一行,但是使用sample我得到了一个空的嵌套框架。
我试着这样采样:

  1. centroids.cache()
  2. centroids.count()
  3. sample_row = centroids.sample(withReplacement=False, fraction=1/centroids.count(),seed=42).limit(1)

但当我执行sample_row.count()时,它返回0。我缓存了质心框架,并通过计数触发了操作,这也证实了框架是非空的(它有6行),那么可能是什么问题呢?

zazmityj

zazmityj1#

documentation of the sample function中,声明:
这不能保证精确地提供给定DataFrame的总计数的指定分数。
基本上,使用大小为5的 Dataframe 和1/5的采样率,您将平均获得一条记录。您可以获得0条记录,1条记录,甚至多达5条记录。让我们用一个例子来说明这一点:

  1. df = spark.range(5)
  2. [df.sample(0.2).count() for i in range(10)]
  3. # yields [1, 4, 2, 0, 2, 0, 0, 0, 1, 2]

正如你所看到的,平均一个,但很少正好是一个,有时是0。
如果你想随机取一条记录,你可以添加一个随机列,按该列排序,并像这样取第一条记录:

  1. from pyspark.sql import functions as F
  2. random_row = df.orderBy(F.rand()).head()

此外,如果您的质心是像k-means这样的随机算法的结果,那么只使用head()就足够了。

相关问题