Spark DataFrame - 选择 n 个随机行

2022-09-01 07:23:41

我有一个包含数千条记录的数据帧,我想随机选择1000行到另一个数据帧中进行演示。如何在Java中执行此操作?

谢谢!


答案 1

您可以随机排列行,然后选取最上面的行:

import org.apache.spark.sql.functions.rand

dataset.orderBy(rand()).limit(n)

答案 2

您可以尝试示例 () 方法。你不能给那里一个数字,而是分数。你可以这样编写函数:

def getRandom (dataset : Dataset[_], n : Int) = {
    val count = dataset.count();
    val howManyTake = if (count > n) n else count;
    dataset.sample(0, 1.0*howManyTake/count).limit (n)
}

解释:我们必须取一小部分数据。如果我们有 2000 行,而您希望获得 100 行,则总行数必须为 0.5。如果要获取比 DataFrame 中更多的行,则必须获取 1.0。调用 limit () 函数以确保舍入正常,并且您获得的行数不超过指定的行数。

编辑:我在其他答案中看到takeSample方法。但请记住:

  1. 这是RDD的方法,而不是数据集,所以你必须这样做:takeSample将收集所有值。dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF()
  2. 请记住,如果您想获得非常多的行,那么OutOfMemoryError会遇到问题,因为takeSample正在驱动程序中收集结果。谨慎使用

推荐