【问题标题】:Random sampling in pyspark with replacement带有替换的pyspark中的随机抽样
【发布时间】:2019-08-12 20:24:32
【问题描述】:

我有一个具有 9000 个唯一 ID 的数据框 df。

喜欢

| id |
  1 
  2 

我想生成一个随机样本,将这 9000 个 id 替换 100000 次。 我如何在 pyspark 中做到这一点

我试过了

df.sample(True,0.5,100)

但我不知道如何精确到 100000 个数字

【问题讨论】:

  • 为了清楚起见,您需要随机抽取 9000 个 id 样本,其中每个样本中有 4,500 个 ids(由于我们使用替换进行抽样,因此可能会重复),您需要 100,000 个这些样本?
  • 9000 是我拥有的不同 ID 的总体,我想通过替换和随机对总体进行过采样到 100000。所以用简单的英语,我想以随机方式从一罐 9000 个 id 中提取一个随机 id 100000 次。我希望这会有所帮助。
  • 成功了,谢谢。我现在会努力解决它。

标签: random pyspark apache-spark-sql


【解决方案1】:

好的,首先要做的事情。您可能无法在您的(过)样本中准确地获得 100,000 个。原因是为了有效地采样,Spark 使用了一个叫做Bernouilli Sampling 的东西。基本上,这意味着它会通过您的 RDD,并为每一行分配被包含的概率。因此,如果您想要 10% 的样本,则每行单独有 10% 的机会被包括在内,但它不会考虑它是否与您想要的数字完美相加,但对于大型数据集来说往往非常接近。

代码如下所示:df.sample(True, 11.11111, 100)。这将抽取一个数据集样本,该样本等于原始数据集大小的 11.11111 倍。由于 11.11111*9,000 ~= 100,000,您将获得大约 100,000 行。

如果你想要一个精确的样本,你必须使用df.takeSample(True, 100000)。但是,这不是分布式数据集。此代码将返回一个数组(一个非常大的数组)。如果它可以在主内存中创建,那么就这样做。但是,因为您需要正确数量的 ID,所以我不知道以分布式方式执行此操作的方法。

【讨论】:

  • 您好 Katya,非常感谢您的回答。我没有得到确切的计数,但如果它以我想要的方式采样就足够了。
  • 您的意思可能是 df.rdd.takeSample() ?没有这样的方法 df.takeSample()
  • .sample() 对我来说不适用于数据帧,尽管它在文档中给出。它正在处理RDD。我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多